jpe*_*lli 6 bash process kill signals background-process
我需要发送SIGINT
以优雅地终止进程,但我不能。
这是一个示例,因为执行发生的环境是“未知”(travis.com 中的 bash 脚本)
通过启动这样的过程,我设法获得(模拟)相同的行为 (command &) &
vagrant@host:~$ (sleep 40 &) &
[1] 8473
vagrant@host:~$ ps -o pid,pgid,args
PID PGID COMMAND
2787 2787 -bash
8474 8473 sleep 40
8490 8490 ps -o pid,pgid,args
[1]+ Done ( sleep 40 & )
vagrant@host:~$ kill -INT 8474 ##### here I send SIGINT to the process
vagrant@host:~$ kill -INT -8473 ##### here I send SIGINT to the process group
vagrant@host:~$ ps -o pid,pgid,args
PID PGID COMMAND
2787 2787 -bash
8474 8473 sleep 40
8559 8559 ps -o pid,pgid,args
Run Code Online (Sandbox Code Playgroud)
我在谷歌上搜索并阅读了很多关于信号和组的信息,但我不明白这里发生了什么。信号是否在某个时候被忽略?怎么了?我怎样才能发送SIGINT
到那个sleep
进程?
编辑:如果SIGTERM
使用,进程被杀死(也许父子外壳被杀死?)
为了让非交互式作业响应 SIGINT,您需要为 SIGINT 创建一个处理程序:
\n\n$ ( (trap "echo Got SigInt" SIGINT; sleep 60) & ) &\n[1] 13619\n$ \n[1]+ Done ( ( trap "echo Got SigInt" SIGINT; sleep 60 ) & )\n$ ps -o pid,pgid,args\n PID PGID COMMAND\n11972 11972 bash\n13620 13619 bash\n13621 13619 sleep 60\n13622 13622 ps -o pid,pgid,args\n$ kill -INT 13620\n$ kill -INT 13621\n$ Got SigInt\n
Run Code Online (Sandbox Code Playgroud)\n\n正如 St\xc3\xa9phane Chazelas 在评论中建议的那样,如果目标是返回 SIGINT 的默认行为,我们可以使用trap - SIGINT
. 例如:
$ ( (trap - SIGINT; sleep 60) & ) &\n[1] 16690\n$ ps -o pid,pgid,args\n PID PGID COMMAND\n11972 11972 bash\n16691 16690 bash\n16692 16690 sleep 60\n16693 16693 ps -o pid,pgid,args\n[1]+ Done ( ( trap - SIGINT; sleep 60 ) & )\n$ kill -INT 16692\n$ ps -o pid,pgid,args\n PID PGID COMMAND\n11972 11972 bash\n16698 16698 ps -o pid,pgid,args\n
Run Code Online (Sandbox Code Playgroud)\n