Gibt es eine Möglichkeit, das Schließen eines Programms durch das Schließen eines anderen auszulösen? Vielleicht ein Shell-Skript?

Gibt es eine Möglichkeit, das Schließen eines Programms durch das Schließen eines anderen auszulösen? Vielleicht ein Shell-Skript?

Meine Situation ist also folgende: Ich habe mithilfe dieses Shell-Skripts einen Launcher, Tastenkombinationen und einen Alias ​​erstellt, der GLava und CMus gleichzeitig in einem Dropdown-Terminal öffnet:

    #!/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

Es ist perfekt und großartig, aber da ist ein kleines Problem. Ich hätte sehr gern, dass beide Programme gleichzeitig GESCHLOSSEN werden. Gibt es eine Möglichkeit, die Beendigung eines Programms ein anderes auslösen zu lassen? Insbesondere wenn ich CMus und GLava geöffnet habe, möchte ich CMus schließen können (zum Beispiel indem ich einfach „q“ drücke und CMus beende oder indem ich das Terminal schließe oder das Programm beende ODER eine spezielle Tastenkombination usw.) und GLava sofort ebenfalls schließen/beenden lassen. Derzeit habe ich eine separate Tastenkombination, um GLava zu pkillen, nachdem ich CMus geschlossen habe, was, denke ich, gut funktioniert, aber sicherlich etwas umständlicher ist, als ich es gerne hätte. Vielleicht gibt es eine Möglichkeit, GLava nur dann auszulösen, wenn CMus läuft, vielleicht eine Art Whitelist? Eine einfache Shell, die beide Programme schließt, die ich binden kann? Oder vielleicht eine andere Idee? Als Neuling bin ich für alle Vorschläge offen. Jede Hilfe wird sehr geschätzt.

Antwort1

Eine einfache Möglichkeit, Prozesse kommunizieren zu lassen, sindSignale.

bashverfügen über einen integrierten Aufruf trap, mit dem Sie einen Handler für ein bestimmtes Signal hinzufügen können, sodass Sie alle Ihre Befehle in ein anderes Skript einbinden und diesen Handler so einstellen können, dass alle anderen Programme beendet werden, wenn dieser ein bestimmtes Signal empfängt.

Halten:

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

Erstellen Sie nun einen Wrap, um die anderen beiden Prozesse zu starten:

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

wenn Sie starten ./wrap.shund dann senden SIGINT(Drücken SieSTRG-C) Sie können Folgendes sehen:

Load program 1 as : 27141
Load program 2 as : 27142
^CKill a process a 27141
kill process b 27142
Kill me : 27140
Terminato

Der Nachteil dabei ist, dassJEDERZEITWenn Sie einen Prozess schließen, werden auch die anderen geschlossen, abgesehen davon, dass Sie von nun an den einen wrapProzess beenden müssen, statt nur einen.

Um diesen Nachteil zu vermeiden, können Sie das Xfce-Programm in einem Skript starten und hier direkt einen Signalhandler festlegen. Wenn eines der beiden ein Schließsignal empfängt, sucht es nach der PID des anderen Xfce-Wrapper-Programms und beendet dieses.

Antwort2

Also, ich bin endlich dazu gekommen, es auszuprobieren, und wie Sie sicher wissen, sind die Idee und Ausführung des Skripts solide. Aber leider ist es nicht das, wonach ich suche. Was ich genau will, ist etwas, wahrscheinlich ein Skript, das die Schließung eines sekundären, spezifischen Programms auslöst, wenn ich das erste spezifische Programm schließe. Nehmen wir also an, ich bin mit dem Musikhören in CMus fertig. Ich möchte dieses Programm schließen können und das sekundäre Programm dadurch ebenfalls schließen lassen. So ähnlich wie Piping, aber für die Programmschließung. Ist das möglich?

verwandte Informationen