我有以下流程。
父进程 -- 子进程 -- 子进程 -- 子进程
我怎样才能仅终止父进程?我不想终止子进程。如果我尝试终止父进程,子进程将收到 SIGHUP 并被终止。
答案1
一般来说,当一个进程变成孤儿进程(即它的父进程死亡)时,它会被 init 收养。
您描述的特殊情况可能适用于交互式进程,当其控制终端关闭时(从维基百科):
当控制终端关闭时,会向进程发送 SIGHUP 信号。它最初设计用于通知进程串行线路断开。在现代系统中,此信号通常表示控制伪终端或虚拟终端已关闭。
为了防止这种情况,子进程应该阻止SIGHUP,因此在大多数情况下您需要父进程的合作。
如果父进程是 shell(bash
,csh
诸如此类),并且你希望运行的命令在 bash 完成时不会终止,则可以在任何命令前加上nohup
(from info coreutils "nohup invocation"
):
'nohup' 运行给定的命令并忽略挂断信号,以便该命令可以在您注销后继续在后台运行。
在此示例中:
$ tty
/dev/ttys000
$ nohup find /dir -name file -exec rm {} \;
find
当 shell 终止并关闭控制终端时不会被杀死/dev/ttys000
。
如果 shell 脚本需要阻止 SIGHUP,请使用内置命令trap
,如下所述这里为了bash
。