Rückgabewert der Timeout-Funktion

9

Ich verwende die Timeout-Funktion auf Debian, um 5 Sekunden auf mein Skript zu warten. Funktioniert gut, aber das Problem, das ich habe, ist, dass ich einen Rückgabewert benötige. Wie 1 für Timeout und 0 für No Timeout. Wie mache ich das?

Schauen Sie sich meinen Code an:

timeout 5 /some/local/script/connect_script -x 'status' > output.txt
# here i need the return of timeout

Wie Sie sehen, gibt mein connect_script -x 'status' den Status als Zeichenfolge zurück und druckt ihn auf dem Bildschirm aus (wahrscheinlich können Sie dies nicht sehen). Hintergrund dieses Problems ist, dass das Skript nichts unternimmt, wenn der Server (für connect_script) einfriert . Deshalb brauche ich dafür eine Auszeit. Und wenn es Zeitüberschreitungen gibt, möchte ich den Server neu starten. Ich kann das tun, aber ich habe keine Ahnung, wie ich sehen kann, ob es eine Zeitüberschreitung gibt oder nicht ...

Null
quelle

Antworten:

18

Wenn das timeoutZeitlimit überschritten wird, wird es mit dem Status 124 beendet . Sie können dies überprüfen, um festzustellen, ob das Skript abgelaufen ist oder nicht.

Stephen Kitt
quelle
Ja Danke. Ich vermisse das im Handbuch. @Christopher poste eine Antwort, die für mich funktioniert. Ich kenne die $ nicht? Syntax. Ihre beiden Antworten sind also richtig;)
Null
6

Nach dem Handbuch ( man timeout):

Synopsis Timeout [OPTION] NUMMER [SUFFIX] BEFEHL [ARG] ...

[...] Wenn der Befehl abgelaufen ist, beenden Sie ihn mit dem Status 124. Andernfalls beenden Sie ihn mit dem Status BEFEHL

Kombinieren Sie dies mit dem Wissen, dass der Exit-Status oder der Rückgabewert in der Variablen gespeichert ist $?, und wir haben ...

timeout 5 /some/local/script/connect_script -x 'status' > output.txt
RETVAL=$?

Dann können Sie mehr Verarbeitung basierend auf dem Wert von $RETVALausführen, der 124 ist, wenn das Zeitlimit überschritten wird, oder einen anderen Wert basierend auf dem Exit-Status von connect_script.

Christopher
quelle
0

Der Rückgabewert von timeouthängt von dem Signal ab, mit dem Sie das untergeordnete Element beenden.

SIGTERM gibt 124 zurück:

timeout -s SIGTERM 1 sleep 2; echo $?

Aber SIGKILLgibt 137 zurück:

timeout -s SIGKILL 1 sleep 2; echo $?

Siehe die Handbuchseite:

Wenn das Zeitlimit für den Befehl abgelaufen ist und --preserve-status nicht festgelegt ist, beenden Sie das Programm mit dem Status 124. Andernfalls beenden Sie das Programm mit dem Status COMMAND. Wenn kein Signal angegeben ist, senden Sie das TERM-Signal bei Zeitüberschreitung. Das TERM-Signal beendet jeden Prozess, der dieses Signal nicht blockiert oder abfängt. Möglicherweise muss das Signal KILL (9) verwendet werden, da dieses Signal nicht abgefangen werden kann. In diesem Fall ist der Ausgangsstatus 128 + 9 und nicht 124.

ceving
quelle