Ich versuche, eine zeitgesteuerte Funktion zu implementieren. Wenn der Timer abläuft, sollte die Funktion/der Befehl beendet werden. Wenn die Funktion/der Befehl beendet ist, sollte der Timer die Bash nicht auf den Timeout des Timers warten lassen.Führen Sie eine zeitgesteuerte Funktion in Bash
(cmdpid=$BASHPID; \
(sleep 60; kill $cmdpid 2>/dev/null) & \
child_pid=$!; \
ssh remote_host /users/jj/test.sh; \
kill -9 $child_pid)
Die test.sh kann oder kann nicht in 60 Sekunden beenden. Das hat gut funktioniert.
Aber wenn ich das Ergebnis der test.sh erhalten möchten, die „ERFOLG“ oder „FAILURE“ Echos, habe ich versucht, mit
result=$(cmdpid=$BASHPID; \
(sleep 60; kill $cmdpid 2>/dev/null) & \
child_pid=$!; \
ssh remote_host /users/jj/test.sh; \
kill -9 $child_pid)
Hier ist es für Timer wartet, um zu beenden. Ich kann sehen, dass "kill -9 $ child_pid" mit dem Befehl set -x ausgeführt wird, aber die Kill-Funktion zerstört nicht wirklich die Sub-Shell.
Welche Sub-Shell sprechen Sie? Wenn der 'sleep' beendet ist, würde der' kill $ cmdpid' die erste Subshell zerstören ... wenn das nur mit einem QUIT-Signal möglich ist (ich bin mir nicht sicher). Mein Zweifel: Kann eine Subshell mit einem QUIT-Signal getötet werden, wenn einer ihrer Kindprozesse gehängt wird? – Jdamian
Das Problem ist, dass Sie die Subshell töten, nicht den "Schlaf" darin.Wenn Sie in ein 'ps' schauen, werden Sie sehen, dass die Eltern-PID von 'sleep' 0 ist. – cdarke
Ist Ihnen der' timeout' Befehl bekannt? Es scheint, als ob du versuchst, das Rad neu zu erfinden ... – gilez