在脚本中杀死进程

时间:2010-12-01 22:15:18

标签: bash

对于我正在使用的某个应用,我遇到了一种奇怪的行为。如果我在bash的后台启动命令,我可以使用

杀死它
$ command &
$ kill -n 2 [PID of command]
  killing command gracefully

但是,当我把它扔进脚本时:

command &
ID=$!
kill -n 2 $ID

根本没有做任何事情。我有什么巧妙的遗漏吗?

编辑:另一个线索是,一旦脚本停止运行,我就无法使用kill -n 2终止命令。

7 个答案:

答案 0 :(得分:1)

男子7号信号 您正在向您的进程发送信号2,INT,即键盘中断,为什么? 人们说要发出信号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