Das Bash-Skript sollte nur die Instanzen eines anderen Skripts beenden, das es gestartet hat

11

In der aktuellen Situation startet ein bestimmtes Skript 'Calling.sh' ein anderes Skript 'Called.sh' im Hintergrund, führt andere Operationen aus, schläft eine Weile und beendet dann 'Called.sh' mit a pkill called.sh. Das funktioniert gut.

Dann möchte ich 'Called.sh' auch von anderen Terminals als eigenständiges Skript zu einem anderen Zeitpunkt starten, sei es vor oder nach dem Starten von Calling.sh. Diese unabhängigen Instanzen sollten nicht durch 'calling.sh' beendet werden.

Wie kann ich das erreichen? Intuition besagt, dass das aufrufende Skript in der Lage sein sollte, den Prozess, den es gestartet hat, von allen anderen Namensgebern zu unterscheiden, die in der Zwischenzeit ausgeführt werden.

Als Variante kann 'Calling.sh' auch 'Called' starten, was eine symbolische Verknüpfung zu 'Called.sh' ist. Erschwert dies die Bewältigung der oben genannten Situation? Welche besonderen Vorsichtsmaßnahmen und Anpassungen erfordert die Verwendung eines symbolischen Links?

XavierStuvw
quelle
1
Ich glaube, Unshare ist speziell dafür: unix.stackexchange.com/a/450242/323121
Rusi

Antworten:

27

Verwenden Sie den Namen nicht, um ihn zu töten. Da das calling.shSkript den Prozess aufruft, den Sie später beenden möchten, verwenden Sie einfach $!(from man bash):

! Erweitert sich auf die Prozess-ID des Jobs, der zuletzt im Hintergrund platziert wurde, unabhängig davon, ob er als asynchroner Befehl oder mithilfe des integrierten bgBefehls ausgeführt wird

Also, wenn Sie so sind calling.sh:

called.sh &
## do stuff
pkill called.sh

Ändern Sie es in dieses:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"
terdon
quelle
4
Dies sollte funktionieren, solange call.sh nicht von selbst stirbt, da andernfalls seine PID wiederverwendet werden könnte, wodurch ein unschuldiger und nicht verwandter Prozess getötet wird.
Eugene Ryabtsev
2
@ EugeneRyabtsev das ist ein sehr guter Punkt. Ich denke, Sie können auch überprüfen, ob die $calledPidübergeordnete PID des PID die PID von ist called.sh.
Terdon
Um die Antwort zu bekräftigen
XavierStuvw
18

Ich musste das aber so oft aus Skripten auswählen; Es macht noch mehr Spaß, wenn die Skripte als Teil eines komplexen automatisierten Zeitplans aufgerufen werden. Sie sollten sich wirklich nicht darauf verlassen pkill, auszuwählen, welches Skript getötet werden soll.

Innerhalb von call.sh sollten Sie die PIDs der von Ihnen gestarteten Jobs aufzeichnen und explizit nach PID beenden.

Innerhalb von calling.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
Philip Couling
quelle