所以,我的情况是这样的:我使用以下 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 中的音乐。我希望能够关闭该程序并触发辅助程序也关闭。有点像管道,但用于程序关闭。这可能吗?