你如何阻止两个并发进程?

时间:2012-10-30 00:53:10

标签: bash shell concurrency process

在我的网站开发工作流程中,我有两个流程:

  1. 观看我的文件夹进行更改
  2. 在浏览器中预览我的网站
  3. 我希望能够运行它们,然后在同一时间停止它们。我见过大家都建议使用&符号运算符:

    process_1 & process_2
    

    但按Ctrl + C只会停止第二个。我必须手动kill第一个。我在这种方法中缺少什么?

2 个答案:

答案 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的所有版本都支持该使用情况。 (请注意,如果任一子进程未响应信号而终止,则父进程不会退出但继续等待。)