有沒有辦法關閉一個程式來觸發另一個程式的關閉?也許是一個 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 中的音樂。我希望能夠關閉該程式並觸發輔助程式也關閉。有點像管道,但用於程式關閉。這可能嗎?

相關內容