我需要从一个脚本中删除正在使用的lv,该脚本在某个对等节点上执行dd,fcsk和更多任务。所以我只是杀死脚本并尝试从该对等体中删除lv,但它似乎无法使用错误打开lvs。
但是对于同样的情况,如果我杀了dd然后删除它的工作正常。 可能是在问一个愚蠢的问题,但需要知道为什么这么说?
答案 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