2010-12-01 153 views
3

我遇到了我正在使用的特定应用程序的奇怪行为。如果我在bash后台启动的命令,我可以使用在脚本中杀死进程

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

但是杀了它,当我把它变成脚本:

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

它不会做任何事情。我有一些微妙的缺失吗?

编辑:另一条线索是,一旦脚本停止运行,我不能使用kill -n 2

+0

`ID = command&`不会做你的想法。 – nmichaels 2010-12-01 22:20:05

+0

对不起,懒惰的我的代码删节。编辑。 – victor 2010-12-01 22:21:13

+0

为什么不使用kill -9 $ PID – chemila 2011-11-10 02:28:59

回答

0

如果命令输出到终端杀命令,bash将与SIGSTOP停止,这将让它忽略你发送的SIGINT。

0

您的$ ID匹配一个命令字符串,而您需要的是一个PID。也许试试这个:

ID=`pidof -s command` 
kill -9 $ID 
0

这可能不是你的问题,但-n是bash的内置kill命令的一个选项。我建议使用-NAME来代替实际的命令。

0

在交互模式下支持作业控制的一些shell在默认情况下不会在脚本中启用作业控制。 set -m将启用作业控制。

0

kill后面加上wait命令。

0

看来,如果命令从脚本运行,它将处理/忽略一些信号。尽管如此,你仍然可以杀死SIGKILL过程(1)所示:

kill -n 1 $ID 
1

人7信号 正在发送信号2,INT,你的过程,即从中断键盘,为什么呢? 人们都在说要发送信号1,为什么?

标准优雅地杀死进程的方式是信号15,终止信号,这是kill所使用的默认值。

所以只使用杀“$ PID”

然后,在你的情况下,处理运行子,你不就是想杀死父亲,但你要杀死他们,所以使用“ - $ PID “而不是”$ PID“来杀死整个进程组,但是由于kill会认为是 - ”$ PID“是一个信号编号,它会发出抱怨,因此您必须更加精确,因为:

kill -15 -"$PID" 

如果程序不不想死,使用kill -9 - “$ PID”

man 7 signal 
man kill