有没有办法通过关闭一个程序来触发另一个程序的关闭?也许是一个 shell 脚本?

有没有办法通过关闭一个程序来触发另一个程序的关闭?也许是一个 shell 脚本?

所以,我的情况是这样的:我使用以下 shell 脚本创建了一个启动器、键绑定和一个别名,可以同时在下拉终端中打开 GLava 和 CMus:

    #!/bin/bash

c=$(ps -e | grep -c xfce4-terminal)

if [ $c -gt 0 ]
    then
        xfce4-terminal --tab --drop-down -x cmus | glava --desktop & $1
    else
        xfce4-terminal --drop-down -x cmus | glava --desktop & $1
fi

它是完美而光荣的,但只是为了一个小问题。我非常希望这两个程序也同时关闭。有没有办法让一个程序的终止触发另一个程序?具体来说,如果我打开 CMus 和 GLava,我希望能够关闭 CMus(例如,只需按“q”并退出 CMus 或关闭终端,或终止程序,或特殊的键绑定等) .) 并让 GLava 立即关闭/终止。就目前情况而言,在关闭 CMus 后,我有一个单独的键绑定到 pkill GLava,我认为它工作得很好,但肯定比我想要的要笨重一些。也许有一种方法可以让 GLava 仅在 CMus 运行时才被触发,也许是一种白名单?一个简单的 shell 可以关闭我可以绑定的两个程序?或者也许还有其他想法?作为菜鸟,我愿意接受任何建议。任何帮助深表感谢。

答案1

让进程进行通信的一种简单方法是信号

bash有一个内置的调用trap,可以让您为给定的信号添加一个处理程序,这样您就可以将所有命令包装在另一个脚本中,并设置这样的处理程序,以在收到给定的信号时杀死所有其他程序。

考虑:

cat proc_a.sh
#!/bin/bash
echo "Load program 1 as : $$"
sleep 1d

cat proc_b.sh
#!/bin/bash
echo "Load program 2 as : $$"
sleep 1d

现在构建一个包装来启动其他两个进程:

cat wrap.sh
#!/bin/bash
./proc_a.sh
a_pid=$!

./proc_b.sh
b_pid=$!

cleanup() {
    echo "Kill process a $a_pid"
    kill $a_pid

    echo "Kill process b $b_pid"
    kill $b_pid

    echo "Kill me : $$"
    kill $$
}

trap cleanup SIGINT

while :;do
   sleep 1d
done

如果您启动./wrap.sh然后发送SIGINT(按CTRL-C)你可以看到这个:

Load program 1 as : 27141
Load program 2 as : 27142
^CKill a process a 27141
kill process b 27142
Kill me : 27140
Terminato

这样做的缺点是任何时候您关闭一个进程,另一个进程也将被关闭,除了从现在开始您需要杀死进程wrap而不是其中一个进程这一事实。

为了避免这个缺点,您可以从脚本中启动 xfce 程序,并直接在此处设置信号处理程序,当两者之一收到关闭信号时,搜索另一个 xfce-wrapper-program 的 pid 并杀死它。

答案2

所以,我终于开始尝试一下,我相信你知道,脚本的想法和执行是可靠的。但不幸的是这不是我要找的。我真正想要的是一些东西,可能是一个脚本,当我关闭第一个特定程序时,它将触发第二个特定程序的关闭。那么,假设我已经听完了 CMus 中的音乐。我希望能够关闭该程序并触发辅助程序也关闭。有点像管道,但用于程序关闭。这可能吗?

相关内容