Bash脚本dd和fsck没有被杀死

时间:2014-11-26 11:31:36

标签: linux bash process kill-process

我需要从一个脚本中删除正在使用的lv,该脚本在某个对等节点上执行dd,fcsk和更多任务。所以我只是杀死脚本并尝试从该对等体中删除lv,但它似乎无法使用错误打开lvs。

但是对于同样的情况,如果我杀了dd然后删除它的工作正常。 可能是在问一个愚蠢的问题,但需要知道为什么这么说?

1 个答案:

答案 0 :(得分:1)

如果您终止将SIGTERM或SIGKILL发送到其PID的脚本,通常您只会将信号发送到父进程。 dd正在子进程中运行,该进程将不会收到信号。一旦父母被杀死,孩子就会被init继承,并且会继续运行。

要将信号发送到整个流程组,请使用:

kill -- -PID

kill -9 -PID

其中PID是脚本的PID。注意PID前面的减号。 来自man kill

-n     where n is larger than 1.  All processes in process group n are signaled.

示例

我从shell脚本运行dd:

 PID  TGID   TID  PGID  PPID COMMAND
 5828  5828  5828  5828 20127 sh
 5829  5829  5829  5828  5828 dd

进程组ID(PGID)是父进程的PID(5828)。

如果我运行以下命令:

kill -9 5828

我得到以下情况:

 PID  TGID   TID  PGID  PPID COMMAND
 5829  5829  5829  5828     1 dd

dd仍在运行,它已被init继承(PPID为1)。 如果我改为:

kill -9 -5828

脚本和dd都被杀了。

编辑:要杀死的进程是通过ssh远程启动的。

远程ssh启动dd / fsck会改变一切。一个简单但不推荐的解决方案可能如下。

脚本在后台通过ssh远程启动dd / fsck并获取PID。

remote_pid=$(ssh user@host 'dd if=/dev/urandom of=/dev/zero & echo $!')

然后脚本不能返回并捕获您的信号。您的处理程序会打开一个新的ssh连接并发出remote_pid信号。

不推荐在第二个ssh连接中清理,因为它可能会失败并留下很多混乱。

有关更高级的解决方案,请参阅https://unix.stackexchange.com/questions/40023/get-ssh-to-forward-signals