別のプログラムを閉じて、あるプログラムを閉じる方法はありますか?たぶんシェルスクリプトですか?

別のプログラムを閉じて、あるプログラムを閉じる方法はありますか?たぶんシェルスクリプトですか?

したがって、私の状況は次のようになります。次のシェルスクリプトを使用して、ドロップダウン端末で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を検索して終了できます。

おすすめ記事