在我的网站开发工作流程中,我有两个流程:
我希望能够运行它们,然后在同一时间停止它们。我见过大家都建议使用&符号运算符:
process_1 & process_2
但按Ctrl + C
只会停止第二个。我必须手动kill
第一个。我在这种方法中缺少什么?
答案 0 :(得分:2)
如何编写两个脚本,一个包含
./process_1 &
./process_2 &
和第二个包含
killall process_1
killall process_2
通过运行第一个脚本启动两个访问,并通过运行第二个脚本结束它们。
答案 1 :(得分:2)
您可以让前台脚本显式终止子进程以响应SIGINT:
#!/bin/sh
trap 'kill $pid1 $pid2' 2
cmd1 &
pid1=$!
cmd2 &
pid2=$!
wait
此示例中存在竞争条件:如果在分配SIGINT
之前将pid1
发送给父级,kill
将发出警告消息,并且不会终止任何子级。如果您在分配SIGINT
之前发送pid2
,则只会向信号发送正在运行cmd1
的进程。在任何一种情况下,父母都将继续运行,并且可以发送第二个SIGINT
。某些版本的kill
允许您通过使用kill -$$
向流程组发送信号来避免此竞争条件,但并非kill
的所有版本都支持该使用情况。 (请注意,如果任一子进程未响应信号而终止,则父进程不会退出但继续等待。)