Valeur de retour de la fonction de temporisation

9

J'utilise la fonction timeout sur debian pour attendre 5 secondes pour mon script. Fonctionne très bien mais le problème que j'ai est que j'ai besoin d'une valeur de retour. Comme 1 pour le délai d'attente et 0 pour aucun délai d'attente Comment vais-je faire cela?

Jetez un œil à mon code:

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

Comme vous voyez mon connect_script -x 'status' retourne le statut sous forme de chaîne et l'imprimez à l'écran (probablement vous ne pouvez pas le voir) Le fond de ce problème est que si le serveur (pour connect_script) est bloqué, le script ne fait rien . C'est pourquoi j'ai besoin d'un délai d'attente. Et quand il expire, je veux redémarrer le serveur. Je peux le faire, mais je ne sais pas comment je peux voir si son délai d'attente ou non ...

Zéro
la source

Réponses:

19

S'il timeoutexpire, il se termine avec le statut 124 ; vous pouvez vérifier cela pour déterminer si le script a expiré ou non.

Stephen Kitt
la source
Oui merci. Cela me manque dans le manuel. @Christopher poste une réponse qui fonctionne pour moi. Je ne connais pas le $? syntaxe. Donc, vos deux réponses sont correctes;)
Zero
6

Selon le manuel ( man timeout):

Délai d'attente du synopsis [OPTION] NUMBER [SUFFIX] COMMAND [ARG] ...

[...] Si la commande expire, quittez avec le statut 124. Sinon, quittez avec le statut COMMAND

Combinez cela avec la connaissance que l'état de sortie ou la valeur de retour est stocké dans la variable $?, et nous avons ...

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

Ensuite, vous pouvez effectuer davantage de traitement en fonction de la valeur de $RETVAL, qui sera 124 s'il expire, ou d'une autre valeur basée sur l'état de sortie de connect_script.

Christophe
la source
1

La valeur de retour de timeoutdépend du signal que vous utilisez pour mettre fin à l'enfant.

SIGTERM renvoie 124:

timeout -s SIGTERM 1 sleep 2; echo $?

Mais SIGKILLrenvoie 137:

timeout -s SIGKILL 1 sleep 2; echo $?

Voir la page de manuel:

Si la commande expire et que --preserve-status n'est pas défini, quittez avec le statut 124. Sinon, quittez avec le statut COMMAND. Si aucun signal n'est spécifié, envoyez le signal TERM à l'expiration. Le signal TERM tue tout processus qui ne bloque ni n'attrape ce signal. Il peut être nécessaire d'utiliser le signal KILL (9), car ce signal ne peut pas être capturé, auquel cas l'état de sortie est 128 + 9 plutôt que 124.

ceving
la source