对于我正在使用的某个应用,我遇到了一种奇怪的行为。如果我在bash的后台启动命令,我可以使用
杀死它$ command &
$ kill -n 2 [PID of command]
killing command gracefully
但是,当我把它扔进脚本时:
command &
ID=$!
kill -n 2 $ID
根本没有做任何事情。我有什么巧妙的遗漏吗?
编辑:另一个线索是,一旦脚本停止运行,我就无法使用kill -n 2终止命令。
答案 0 :(得分:1)
杀死进程的标准优雅方法是信号15,终止信号,这是kill使用的默认值。
所以只需使用kill“$ PID”
然后,如果你的进程运行子进程,你不仅要杀死父进程,而且你想要全部杀死它们,所以使用“ - $ PID”而不是“$ PID”来杀死整个进程组,但是因为杀戮会认为 - “$ PID”是一个信号编号,它会抱怨,所以你必须更精确,如:
kill -15 -"$PID"
如果程序不想死,请使用kill -9 - “$ PID”
man 7 signal
man kill
答案 1 :(得分:0)
如果您向终端命令输出,bash将使用SIGSTOP将其停止,这将使其忽略您要发送的SIGINT。
答案 2 :(得分:0)
您的$ ID与命令字符串匹配,而您需要的是PID。也许试试这个:
ID=`pidof -s command`
kill -9 $ID
答案 3 :(得分:0)
这可能不是你的问题,但-n是bash的内置kill命令的选项。我建议使用-NAME,以便它也适用于实际的命令。
答案 4 :(得分:0)
默认情况下,某些在交互模式下支持作业控制的shell不会在脚本中启用作业控制。 set -m
将启用工作控制。
答案 5 :(得分:0)
在wait
之后添加kill
命令。
答案 6 :(得分:0)
似乎在从脚本运行命令的情况下,它将处理/忽略某些信号。不过,你仍然可以使用SIGKILL(1)来杀死进程:
kill -n 1 $ID