如何监控两个流程&;退出时做些什么(bash脚本)?

如何监控两个流程&;退出时做些什么(bash脚本)?,bash,shell,scripting,Bash,Shell,Scripting,我正试图在bash中编写一个包装器脚本,以自动启动和关闭需要同时运行的三个程序: #!/bin/bash gnome-screensaver-command -i -n aeolus-wrapper.sh & aeolus & qjackctl 启动它们后,我需要监视aeolus和qjackctl,并在aeolus或qjackctl退出时终止其余两个进程: # if aeolus exits, kill gnome-screensaver-command and qjackct

我正试图在bash中编写一个包装器脚本,以自动启动和关闭需要同时运行的三个程序:

#!/bin/bash
gnome-screensaver-command -i -n aeolus-wrapper.sh &
aeolus &
qjackctl
启动它们后,我需要监视aeolus和qjackctl,并在aeolus或qjackctl退出时终止其余两个进程:

# if aeolus exits, kill gnome-screensaver-command and qjackctl
# if qjackctl exits, kill gnome-screensaver-command and aeolus
这就是我被困的地方。我对这个演示很感兴趣,它显示了如何使用
until
循环来监视一个进程,并在它死掉时重新启动它,但我不太确定如何从那里到达我想去的地方。欢迎提出任何建议

if [ "a$(pgrep aeolus)" != "a" ] ; 
then 
    pkill gnome-screensaver-command 
    pkill qjackctl
fi
同样适用于
qjackctl

另一种语法

if pgrep aeolus
then 
    pkill gnome-screensaver-command 
    pkill qjackctl
fi

不要使用while循环。只需阻塞并等待SIGCHLD通知您其中一个进程已终止。在陷阱中,杀死其余正在运行的进程。例如:

#!/bin/bash set -m trap 'list=$( jobs -rp ); test -n "$list" && kill $list' CHLD cmd1 & cmd2 & cmd3 & wait #!/bin/bash set-m 陷阱'列表=$(作业-rp);测试-n“$list”和杀死$list”CHLD cmd1& cmd2& cmd3& 等待
这将运行3个命令。当一个退出时,其他两个将被发送SIGTERM。

如果!pgrep aeolus;然后…`@SiegeX首先我用了
if语法。出于某种原因,它在我的电脑上不起作用。所以我编辑了
kill
现在也被
pkill
取代。事实上,我保留了那些杀戮线供OP编辑。谢谢。这看起来像我想要的,除了一件事:如果我关闭qjackctl,它确实会杀死aeolus和gnome屏幕保护程序命令。但如果我关闭风神,它不会成功杀死qjackctl。相反,在命令行上我看到“jackmain捕获信号12”,包装器脚本继续等待。(请注意,qjackctl是jackd的GUI前端;当您启动aeolus时,它会自动启动jackd。)听起来好像aeolus正在捕获SIGTERM并将SIGSYS发送给jackd。你需要弄清楚你可以发送什么信号给aeolus来成功终止它。结果是:(1)qjackctl实际上是qjackctl.bin,需要这样列出;(2) jackd需要明确地包含在列表中。所以这就是工作原理:
#/bin/bash set-m trap'list=$(jobs-rp);test-n“$list”和kill$list”CHLD-gnome屏幕保护程序命令-i-n aeolus-wrapper.sh和jackd-T-ndefault-dalsa-dhw:0-r44100-p1024-n2&aeolus&qjackctl.bin&wait
,当然这里没有显示适当的换行符。再次感谢你的帮助。