"kill -INT $pid"无法杀死进程,但是ctrl+c可以。

3

我有一个基本的bash脚本,它会打印出自己的pid,然后计数到100:

echo $$
for i in {1..100}
do
    echo $i
    sleep 1
done

当我在运行程序时按下ctrl+c,程序将以130的退出码停止运行。我试图发送一个信号来模拟ctrl+c并导致程序停止运行,并以130的退出码退出。
当我在另一个终端窗口中输入“kill -INT”时,没有任何反应,尽管据我所知,它应该与按下ctrl+c相同。但是,当我键入“kill -9”时,我可以成功地终止程序,尽管退出码不同。如何使用中断信号停止我的程序,使其以正确的代码退出?

你能再澄清一下你的需求吗?脚本已经在按下Ctrl + C时以130代码退出了。你是不是想让你的脚本捕获信号并以130以外的代码退出? - Inian
@quantumbutterfly:那个-9给你一个不同的退出代码是显而易见的,因为它是一个不同的信号,所以问题归结为为什么你的kill -INT没有被传递。事实上,我可以在不需要整个脚本的情况下重现这种情况:bash -c 'echo $$; sleep 120',然后在显示的PID上执行kill -INT。对我来说,它也不能终止进程。如果我将其更改为bash -c 'trap "echo intreceived" INT; echo $$; sleep 120'并发送_kill_,我甚至没有得到输出_intreceived_,这意味着信号没有被传递。不知道为什么会出现这种情况。 - user1934428
1个回答

2
在进程ID前加上破折号“-”。最初的回答。
kill -SIGINT -<pid>

这将终止带有退出码130的进程。

更新:为什么不使用默认情况下由kill命令发送的SIGTERM(15)信号(没有信号编号或名称)?


确实有效。你能解释一下原因吗?kill 的 man 页面没有提到这一点,当我执行 kill TERM <pid> 时,我不需要在 pid 前面加破折号。 - user1934428
@JUSHJUSH 看起来 OP 正在使用 MacOS,没有提到进程组。 - Yuri Ginsburg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接