Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在脚本中终止进程_Bash - Fatal编程技术网

Bash 在脚本中终止进程

Bash 在脚本中终止进程,bash,Bash,我在使用某个应用程序时遇到了一种奇怪的行为。如果我在bash的后台启动该命令,我可以使用 $ command & $ kill -n 2 [PID of command] killing command gracefully 但是,当我将其放入脚本时: command & ID=$! kill -n 2 $ID 它一点作用也没有。有没有什么微妙的地方我错过了 编辑:另一个线索是,一旦脚本停止运行,我就不能使用kill-n2终止命令。如果命令输出到终端,bash将使用SIG

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

$ command &
$ kill -n 2 [PID of command]
  killing command gracefully
但是,当我将其放入脚本时:

command &
ID=$!
kill -n 2 $ID
它一点作用也没有。有没有什么微妙的地方我错过了


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

如果命令输出到终端,bash将使用SIGSTOP停止它,这将使它忽略正在发送的SIGINT。

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

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

这可能不是您的问题,但是-n是bash内置kill命令的一个选项。我建议改为使用-NAME,以便它也适用于实际的命令。

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

在您的
kill
之后立即添加一个
wait
命令。如果该命令是从脚本运行的,它似乎会处理/忽略一些信号。尽管如此,您仍然可以使用SIGKILL(1)终止进程,如下所示:

kill -n 1 $ID
man 7信号机 您正在向进程发送一个信号2,INT,这是来自键盘的中断,为什么? 人们说要发出信号1,为什么

终止进程的标准方式是信号15,终止信号,这是kill使用的默认值

所以只需使用kill“$PID”

然后,如果您的进程运行子进程,您不仅要杀死父进程,还要杀死所有子进程,因此使用“-$PID”而不是“$PID”来杀死整个进程组,但由于kill会认为-“$PID”是一个信号号,它会抱怨,因此您必须更精确,如下所示:

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


ID=command&
没有按您的想法执行。对不起,我在代码的删节上太懒了。已编辑。为什么不使用kill-9$PID
man 7 signal
man kill