如果您终止向其 PID 发送 SIGTERM 或 SIGKILL 的脚本,通常您只会将信号发送到父进程。 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