linux shell kill信号SIGKILL && KILL

标签 linux bash shell kill

我刚刚写了一个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/

相关文章:

bash - 如何在heroku procfile中编写多行命令

linux - 通过检查多个条件提取字符串的一部分 - Shell 脚本

linux - 如何在 Linux 中从 HTTP MIME 编码消息中提取文件数据?

bash - 你将如何在 bash 中表示 EOF?

python - 将多个参数从 bash 传递到 python

linux - shell 中的 "invalid arithmetic operator"

shell - Grails shell 在 Grails 3.0.2 中不起作用?

c++ - 在 Qt Gui 中使用 std::cout

linux - 交叉编译树莓派 opencv 链接问题

windows - 什么是虚拟化(针对服务器)以及如何设置它