在我的网络开发工作流中,我有两个进程:
- 看我的文件夹进行更改
- 在浏览器中预览我的网站
我希望能够运行它们,然后稍后同时停止它们。我已经看到每个人都建议使用&and and oterator:
process_1 & process_2
但是按Ctrl + C
仅停止第二个。我必须手动进行kill
。我在这种方法中缺少什么?
您可以将前景脚本明确杀死子过程,以响应Sigint:
#!/bin/sh
trap 'kill $pid1 $pid2' 2
cmd1 &
pid1=$!
cmd2 &
pid2=$!
wait
在此示例中有一个种族条件:如果您在分配pid1
之前将SIGINT
发送给父,kill
将发出警告消息,并且不会终止任何孩子。如果在分配pid2
之前发送SIGINT
,则仅将运行cmd1
的进程发送信号。无论哪种情况,父母都将继续运行,并且可以发送第二个SIGINT
。kill
的某些版本可让您通过使用kill -$$
向进程组发送信号来避免这种情况,但并非所有版本的kill
支持该使用情况。(请注意,如果任何一个子进程均未响应信号终止,则父母不会退出,而是继续等待。)
如何编写两个脚本,一个包含
./process_1 &
./process_2 &
和第二个包含
的killall process_1
killall process_2
通过运行第一个脚本开始两个prcesses,并通过运行第二个脚本结束它们。