如何监控两个流程&如果一个退出(bash脚本),做一些事情?

时间:2012-01-14 05:20:15

标签: 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 qjackctl
# if qjackctl exits, kill gnome-screensaver-command and aeolus

这就是我被困住的地方。我对this example很感兴趣,它展示了如何使用until循环来监视进程并在它死亡时重新启动它,但是我不太确定如何从那里到达我想去的地方。任何建议都非常欢迎。

2 个答案:

答案 0 :(得分:2)

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

#!/bin/bash

set -m
trap 'list=$( jobs -rp ); test -n "$list" && kill $list' CHLD
cmd1 &
cmd2 &
cmd3 &
wait

这将运行3个命令。当一个退出时,另外两个将被发送SIGTERM。

答案 1 :(得分:1)

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