我刚刚写了一个shell脚本来控制一个模块的启动和停止。一切似乎都很正常,直到我发现停止命令导致意外结果。
我使用命令 kill -s SIGKILL -- -gpid
来终止一组进程。我使用 /bin/sh
来运行这样的命令
/bin/sh -c "kill -s SIGKILL -- -gpid"
哪个回复了错误
/bin/sh: line 0: kill: SIGKILL: invalid signal specification
Then I replaced the /bin/sh
with /bin/bash
, so the command is
/bin/bash -c "kill -s SIGKILL -- -gpid"
回复没有错误。所以我总结了 bash 和 sh 之间的差异导致结果的解释。但是,当我 ls
/bin/sh
时,我发现 /bin/sh
是到 /bin/的符号链接(symbolic link)bash
,所以命令应该是一样的。
我发现命令语法 kill -s SIGKILL
不在推荐的语法中,推荐 kill -s KILL
。
所以我把SIGKILL换成了KILL,命令是
/bin/sh -c "kill -s KILL -- -gpid"
回复没有错误。如上所述,任何人都可以解释这种情况。
最佳答案
编写此命令的唯一真正可移植方式是
kill -9 -$gpid
没有指定信号名称而不是信号编号的方法适用于在 90 年代中期卡住其 shell 实用程序的 Unix,这基本上是所有其中除了 Linux 和开源 BSD。然而,SIGKILL 是可靠的信号编号 9,并且一直如此(如果不是更早的话,从 V7 开始)。
特殊参数 --
也不可移植,在这种情况下是不必要的。
如果您想更礼貌一点(改为发送 SIGTERM),请使用
kill -15 -$gpid
再一次,这个数字一直到 V7 都是可靠的。
关于linux shell kill信号SIGKILL && KILL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16423732/