Im folgenden Skript versuche ich herauszufinden, wie waitpid
funktioniert, aber es wartet nicht auf ssh
process zum Beenden. done
wird sofort gedruckt und nicht nachdem der Prozess ssh
existiert.
Frage
Wie mache ich waitpid
nur weiter, wenn die PID, die ich gebe, beendet wurde?
Ich habe es auch versucht
%Vor% aber es erreicht nicht den ersten print
aus irgendeinem Grund und wird nie beendet.
Die Funktionsfamilie wait
funktioniert nur bei untergeordneten Prozessen, auch waitpid
. Der Schlafprozess ist nicht dein Kind, es ist das Kind deines Kindes. Dies liegt daran, dass system
im Wesentlichen fork
+ exec
ist. Wenn Sie das Parallel :: ForkManager + -System verwenden, verzweigen Sie, forkieren Sie dann erneut und führen Sie dann den Ruhezustand aus.
Da du bereits gegabelt hast, solltest du exec verwenden. Dies hat den zusätzlichen Vorteil, dass der Aufruf von pgrep und sein Timing-Problem nicht benötigt wird (dh es ist möglich, dass der Elternteil pgrep aufruft, bevor das Kind das System ausgeführt hat).
%Vor% Der Einfachheit halber wird jetzt Schlaf verwendet. Eine Warnung von Perl, dass "Statement wahrscheinlich nicht erreicht wird" muss unterdrückt werden, da Perl nicht erkennt, dass $pm->start
gespalten ist. Dies sollte no warnings "exec"
sein, aber das funktioniert nicht, also musste ich sie alle unterdrücken.