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?
Antworten:
Verwenden Sie den Namen nicht, um ihn zu töten. Da das
calling.sh
Skript den Prozess aufruft, den Sie später beenden möchten, verwenden Sie einfach$!
(fromman bash
):Also, wenn Sie so sind
calling.sh
:Ändern Sie es in dieses:
quelle
$calledPid
übergeordnete PID des PID die PID von istcalled.sh
.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:
quelle