私の状況は次のようになります。次のシェル スクリプトを使用して、ドロップダウン ターミナルで 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
これは完璧で素晴らしいのですが、小さな問題が 1 つあります。両方のプログラムを同時に閉じたいのですが、一方のプログラムの終了によってもう一方のプログラムも終了させる方法はありますか? 具体的には、CMus と GLava を開いている場合、CMus を閉じると (たとえば、単に 'q' を押して CMus を終了するか、ターミナルを閉じるか、プログラムを強制終了するか、特別なキー バインディングなど)、GLava もすぐに閉じて終了するようにしたいです。現状では、CMus を閉じた後に GLava を pkill するための別のキー バインディングがあり、これで問題なく動作すると思いますが、確かに私の希望よりも少し不格好です。CMus が実行中の場合のみ GLava がトリガーされるようにする方法があるかもしれません。ホワイトリストのようなものでしょうか? バインドできる両方のプログラムを閉じる単純なシェルでしょうか? あるいは別の考えでしょうか? 私は初心者なので、どんな提案でも歓迎します。どんな助けでも大歓迎です。
答え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
次に、他の 2 つのプロセスを起動するためのラップを構築します。
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
これの欠点はいつでも1 つのプロセスを閉じると、他のプロセスも閉じられます。ただし、これからは、wrap
プロセスの 1 つではなく を強制終了する必要があります。
この欠点を回避するには、スクリプトから xfce プログラムを起動し、ここで直接シグナル ハンドラーを設定します。2 つのうちの 1 つが終了シグナルを受信すると、他の xfce ラッパー プログラムの pid を検索してこれを強制終了します。
答え2
それで、ようやくこれを試してみることにしました。ご存知のとおり、スクリプトのアイデアと実行はしっかりしています。しかし、残念ながら、私が求めているものではありません。私がまさに求めているのは、最初の特定のプログラムを閉じるときに、2 番目の特定のプログラムを閉じるトリガーとなるスクリプトです。たとえば、CMus で音楽を聴き終えたとします。そのプログラムを閉じると、2 番目のプログラムも閉じるようにトリガーされるようにしたいのです。パイピングのようなものですが、プログラムを閉じるためのものです。これは可能ですか?