在脚本中终止进程

3

我遇到了一个奇怪的问题,与我正在使用的某个应用程序有关。如果我在bash中将命令启动在后台运行,我可以使用以下命令杀死它:

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

然而,当我将这个内容放入脚本中时:
command &
ID=$!
kill -n 2 $ID

它根本什么也没做。我有什么细微之处不明白吗?

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


ID=command& 并不是你想象中的那样。 - nmichaels
抱歉,我在简化代码时有些懒惰。已经编辑过了。 - victor
为什么不使用 kill -9 $PID? - chemila
7个回答

1

man 7 signal 你正在向你的进程发送信号2,即来自键盘的中断信号,为什么? 有人建议发送信号1,为什么?

优雅地终止一个进程的标准方式是使用信号15,即终止信号,这是kill命令默认使用的信号。

所以只需使用kill "$PID"

然后,如果你的进程运行子进程,你不仅想杀死父进程,还想杀死所有子进程,所以使用"- $PID"而不是"$PID"来杀死整个进程组,但由于kill会认为-"$PID"是一个信号编号,它会抱怨,所以你需要更加精确,如下:

kill -15 -"$PID"

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

man 7 signal
man kill

0

看起来如果命令是从脚本中运行的,它将处理/忽略一些信号。尽管如此,您仍然可以像这样使用SIGKILL(1)终止进程:

kill -n 1 $ID

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命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接