重击僵尸


11

Bash似乎不会制造僵尸。看起来这些进程在被杀死时会立即收获。

我可以让bash变成僵尸吗?


我为什么要问:

我希望能够安全地杀死一个子进程,或者kill -9如果它在一定时间内没有消失,则可以安全地杀死它,但是我不想意外破坏不是我的子进程的进程。僵尸进程通常非常容易,而且在竞争条件下也很安全。


1
也许是另一个主意...如果您真的想防止杀死外部进程,请查看cgroup。调用unshare以创建PID名称空间,以便从该进程树内部隔离外部进程,并且无法访问这些外部进程。
Orion

使用作业控制(例如,作业号在kill -KILL %n哪里n,等等),而不是试图绕开它。
名义动物

好问题!不过,还有另一种“为什么问”的方法:您考虑过该timeout命令吗?
通配符'18

Answers:


13

进行僵尸进程:

$ (sleep 1 & exec /bin/sleep 10)

该更换哪个运行shell sleep 1/bin/sleep 10的是不会知道的sleep 1进程终止,因此,创建一个僵尸,持续10秒。


我不确定杀死僵尸进程会有什么期望。僵尸进程已经死亡,您无法杀死它。

实际上,您可以使僵尸进程消失,但是通过杀死其父进程,而不是僵尸进程本身。


收割的PID会被回收。僵尸的要点是,它们会保留PID,直到父母通过等待孩子确认死亡为止。否则,杀死一个pid可能会导致意外的受害者。
PSkocik

1
在C语言中,您可以确保杀死孩子时不会成为意外受害者,因为在等待该孩子之前,该孩子的PID不能被回收。我希望能够在外壳中具有相同的保证。
PSkocik

3

没有那么有趣的答案:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>

这是一个僵尸过程吗?才停下来 还有$BASHPID就是$$我的想法。
加博尔·萨尔迪

$BASHPID一样的$$。请尝试以下代码: echo $$ $BASHPID ;echo $(echo $$ $BASHPID)。您可以在中找到更多信息man bash
Alex Baranowski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.