我刚写了一个shell脚本来控制模块的启动和停止。一切似乎正常,直到我发现停止命令导致了意外情况。
我使用kill -s SIGKILL -- -gpid
命令来杀死一组进程。我使用/bin/sh
运行这个命令,像这样:
/bin/sh -c "kill -s SIGKILL -- -gpid"
回复的错误如下:
/bin/sh: 行 0: kill: SIGKILL: 无效的信号规范
然后我将/bin/sh
替换为/bin/bash
,所以命令变成了:
/bin/bash -c "kill -s SIGKILL -- -gpid"
它没有返回任何错误信息,因此我得出结论是bash和sh之间的差异导致了结果不同。然而,当我使用ls
命令查看/bin/sh
时,我发现/bin/sh
是指向/bin/bash
的符号链接,所以这两个命令应该是相同的。
我发现kill -s SIGKILL
命令语法不符合推荐的语法,应该使用kill -s KILL
命令。
因此,我将SIGKILL替换为KILL,命令如下:
/bin/sh -c "kill -s KILL -- -gpid"
回复了空错误。正如上面所述,任何人都可以解释这种情况。
sh
的方式调用bash
(例如通过符号链接,就像你的情况一样)时,它会使用与 sh 兼容的模式,其中大多数现代特性都被关闭。我敢打赌sh
正在调用kill
的外部二进制文件,并且它不识别SIGKILL
,但是bash
调用却使用了其内置的命令,而该内置命令则识别SIGKILL
。 - Kevinargv[0]
来执行这个操作的吗? - Shahbazargv[0]
。 - Kevin