
したがって、私の状況は次のようになります。次のシェルスクリプトを使用して、ドロップダウン端末で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を起動する方法があります。一種のホワイトリストでしょうか?単純なシェルにバインドできる2つのプログラムを閉じることはできますか?それとも別のアイデアがありますか?初心者なのでどんな提案でも歓迎します。どんな助けでも大変感謝します。
答え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
これの欠点はいつでもあるプロセスを閉じると、他のプロセスも閉じます。ただし、wrap
これからはプロセスの1つではなく、プロセスを終了しなければならない点だけが異なります。
この欠点を回避するには、スクリプトでxfceプログラムを起動し、そこに直接シグナルハンドラを設定することができます。どちらかが終了シグナルを受け取ったら、別のxfce-wrapper-プログラムのpidを検索して終了できます。
答え2
それで、ついに一度試してみましたが、ご存知のようにスクリプトのアイデアと実行がしっかりしていました。しかし残念ながら、それは私が探しているものではありません。私が本当に望むのは、最初の特定のプログラムを閉じたときに2番目の特定のプログラムを閉じるようにするスクリプトです。それでは、CMusで音楽を聴くのをやめたとしましょう。プログラムを閉じて補助プログラムも閉じることができるようにしたいと思います。パイプに似ていますが、プログラムの終了に使用されます。可能ですか?