Die PID eines Bash-Child-Prozesses (imapsync) - wie kommt man darauf?

15

Kann mir jemand sagen, wie ich die PID eines in bash ausgeführten Befehls erhalte.

Ich habe zB ein Bash-Skript, das imapsync ausführt.

Wenn das Skript beendet wird, wird der Imapsync-Prozess nicht immer beendet. Daher möchte ich in der Lage sein, die PID von Imapsync programmgesteuert in meinem Skript zu identifizieren, damit ich den Imapsync-Prozess selbst in einem Signalhandler beenden kann.

Wie kann ich die PID eines untergeordneten Prozesses programmgesteuert aus einem übergeordneten Bash-Skript abrufen?

Jason Tan
quelle
1
Wie wäre es mit "pidof imapsync"? Was stimmt damit nicht?
Pitr
2
Pidof kannte ich nicht. Aber jetzt, wo ich es tue, ist es für dieses Szenario nicht sinnvoll, soweit ich das beurteilen kann, da pidof alle Prozesse des angegebenen Befehls auf einem System zurückzugeben scheint - auch die, die anderen Skripten / Benutzern gehören. Außerdem ist imapsync eigentlich ein Perl-Skript. Ich würde also ein PIDOF-Perl ausführen, das wahrscheinlich wieder Prozesse zurückgibt, die nicht imapsync sind und möglicherweise anderen Benutzern gehören.
Jason Tan
Javier ist richtig. Auf dieser Seite finden Sie weitere Informationen zu ProcessManagement .
Sinping

Antworten:

4

Imapsync hat eine Option, um festzulegen, wo seine PID geschrieben wird:

--pidfile: Die Datei, in die die imapsync-PID geschrieben wird.

Gilles LAMIRAL
quelle
Zu Ihrer Information, dies beantwortet meine Frage nicht wirklich im allgemeinen Sinne, aber ich habe das Argument --pidfile entdeckt und mit einigem Durcheinander war es bisher gut genug ..
Jason Tan
@JasonTan, warum sollte man einem Mann das Fischen beibringen, wenn man ihm ein schmackhaftes, vorgekochtes Filet geben kann, damit er morgen wiederkommt und nach mehr verlangt? Entschuldigung für den alten Beitrag, aber warum diese Antwort über Javiers akzeptieren?
synchronisiert
46
any_command args &
my_child_PID=$!

IOW enthält, genau wie $$Ihre PID, $!die PID des zuletzt ausgeführten Hintergrundbefehls .

Javier
quelle
Danke, aber imapsync ist nicht im Hintergrund und $! wird nicht gesetzt, wenn ich es in der nächsten Zeile nach dem imapsync-Aufruf oder in der ersten Zeile des Signal-Handlers wiedergebe. :-(
Jason Tan
6
Wenn es das Kind gabelt und hinterlässt, liegt es in der Verantwortung der Eltern, die PID des Kindes irgendwo zu speichern. übliche Praxis ist es, es irgendwo zu speichern /var/run/whatever.pid. Möglicherweise gibt es eine Befehlszeilenoption, mit der Sie aufgefordert werden, die PID irgendwo zu speichern. Wenn nicht, klingt das nach einer Funktion, die Sie den Autor fragen oder die Sie selbst implementieren müssen.
Javier
1
Schwerpunkt auf Hintergründen . Wenn kein Prozess in den Hintergrund gestellt wurde (dh mit angefügtem Prozess &), ist die $!Variable undefiniert.
Trevor
1
Weitere ähnliche Lösungen finden Sie in (eine Antwort auf) So erhalten Sie Informationen zum gerade gestarteten Prozess . als ergänzung zu dieser antwort steht in einem kommentar: oh, und der "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24. november 10 um 14:28
imz - Ivan Zakharyaschev
10

Im Gegensatz zu pidof, pgrepkann eine Vielzahl von Optionen gegeben werden , zu beschränken , welche Prozesse es gibt PIDs für. Eine besonders nützliche Option ist die Auswahl basierend auf der PPID unter Verwendung der PID des aktuellen Prozesses.

pgrep -P $$ imapsync

Die PIDs von imapsync werden nur ausgegeben, wenn sie untergeordnete Elemente Ihres Skripts sind.

Bis auf weiteres angehalten.
quelle
0

Wie wäre es, wenn Sie Imapsync für einen Moment in den Hintergrund stellen, die PID abrufen und dann in den Vordergrund stellen ... Etwa so:

imapsync &
pid=$!
wait $pid
retVal=$?
Kennzeichen
quelle