Ich schreibe ein Bash-Skript, mit inotifywait
dem ich ein Verzeichnis überwachen und Aktionen starten kann, wenn Änderungen erkannt werden. Etwas wie:
inotifywait -m ... | while read f; do something; done
Da inotifywait
dieses Skript nicht von selbst beendet wird, wird es nicht angehalten.
Mein Plan war es also, die PID des inotifywait-Prozesses zu erhalten, sie in einer Datei zu speichern und sie später von einem anderen Prozess beenden zu lassen.
inotifywait -m ... | { echo ??PID?? > pid-file; while ... }
Aber ich weiß nicht, wie ich die PID bekommen soll. Gibt es einen einfachen Weg, dies zu erreichen? Eine andere Möglichkeit besteht darin, die PID des Shell-Skripts $$
in der Datei zu speichern und das gesamte Shell-Skript zu beenden, aber ich wollte nach der while-Schleife eine Bereinigung durchführen.
Ich habe versucht, es zu verwenden, coproc
und ich denke, es wird funktionieren, aber es scheint komplizierter als nötig zu sein.
pgrep inotifywait
. Das gibt dir die PID, um zu töten ,pkill inotifwait
.grep -v grep
, sondernps -ef | grep [p]rocessname...
würden das gleiche tun.-f
Schalter verwenden, wenn Sie mit mehr Namen der ausführbaren Dateien übereinstimmen müssen.Antworten:
In einer Pipeline werden alle Prozesse gleichzeitig gestartet . Es gibt keinen, der früher als die anderen ist.
Du könntest es tun:
Oder tragbar:
Beachten Sie auch, dass die Subshell, die die
while
Schleife ausführt,inotifywait
beim nächsten Schreiben automatisch beendet wird, wenn sie etwas in stdout schreibt.quelle
Wenn Sie die Prozess-ID in der Schleife benötigen, drucken Sie sie zuerst aus.
quelle
Diese SO-Antwort scheint zutreffend:
quelle