我刚刚写了一个shell脚本来控制模块的启动和停止。一切看起来都很正常,直到我发现停止命令导致了意想不到的结果。
我使用命令kill -s SIGKILL -- -gpid
杀死一组进程。我用/bin/sh
像这样运行命令
/bin/sh -c "kill -s SIGKILL -- -gpid"
哪个回答了错误
/bin/sh: line 0: kill: SIGKILL: invalid signal specification
然后我更换了/bin/sh
with /bin/bash
,所以命令是
/bin/bash -c "kill -s SIGKILL -- -gpid"
没有回复任何错误。所以我总结解释是bash和sh的区别导致了这个结果。然而,当我ls
the /bin/sh
,我找到了/bin/sh
是一个符号链接/bin/bash
,所以命令应该是相同的。
我找到了命令语法kill -s SIGKILL
不在推荐的语法中,kill -s KILL
受到推崇的。
所以我用KILL替换了SIGKILL,命令是
/bin/sh -c "kill -s KILL -- -gpid"
没有回复任何错误。如上所述,任何人都可以解释这个案例。
唯一的truly编写此命令的便携式方法是
kill -9 -$gpid
None指定信号的方法name而不是 Unix 上的信号号工作,在 90 年代中期冻结了它们的 shell 实用程序,这基本上是除了 Linux 和开源 BSD 之外的所有 UNIX 上的功能。然而,SIGKILL 是可靠的信号编号 9,并且一直如此(从 V7 开始,如果不是更早的话)。
特殊论证--
也不是便携式的,并且在这种情况下是不必要的。
如果你想更有礼貌一点(改为发送 SIGTERM),那么使用
kill -15 -$gpid
同样,这个数字一直到 V7 都是可靠的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)