Valor de retorno de la función de tiempo de espera

9

Estoy usando la función de tiempo de espera en Debian para esperar 5 segundos para mi script. Funciona muy bien, pero el problema que tengo es que necesito un valor de retorno. Como 1 para el tiempo de espera y 0 sin tiempo de espera. ¿Cómo voy a hacer esto?

Echa un vistazo a mi código:

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

Como puede ver mi connect_script -x 'status' devuelve el estado como una cadena e imprime en la pantalla (probablemente no pueda ver esto) El fondo de este problema es que si el servidor (para connect_script) se congela, el script no hace nada . Es por eso que necesito el tiempo de espera alrededor de eso. Y cuando se agota el tiempo de espera, quiero reiniciar el servidor. Puedo hacer eso, pero no tengo idea de cómo puedo ver si es tiempo de espera o no ...

Cero
fuente

Respuestas:

19

Si se timeoutagota el tiempo de espera, sale con el estado 124 ; puede verificar esto para determinar si el script expiró o no.

Stephen Kitt
fuente
Si gracias. Extraño esto en el manual. @Christopher publica una respuesta que me funciona. No se los $? sintaxis. Entonces ambas respuestas son correctas;)
Cero
6

Según el manual ( man timeout):

Sinopsis timeout [OPTION] NUMBER [SUFFIX] COMMAND [ARG] ...

[...] Si el comando agota el tiempo de espera, salga con el estado 124. De lo contrario, salga con el estado de COMANDO

Combine esto con el conocimiento de que el estado de salida o el valor de retorno se almacenan en la variable $?, y tenemos ...

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

Luego, puede realizar más procesamiento en función del valor de $RETVAL, que será 124 si se agota el tiempo de espera, o algún otro valor en función del estado de salida de connect_script.

Christopher
fuente
1

El valor de retorno de timeoutdepende de la señal que use para terminar al niño.

SIGTERM devuelve 124:

timeout -s SIGTERM 1 sleep 2; echo $?

Pero SIGKILLdevuelve 137:

timeout -s SIGKILL 1 sleep 2; echo $?

Ver la página del manual:

Si el comando agota el tiempo de espera y --preserve-status no está configurado, salga con el estado 124. De lo contrario, salga con el estado de COMMAND. Si no se especifica ninguna señal, envíe la señal TERM al tiempo de espera. La señal TERM termina con cualquier proceso que no bloquee o atrape esa señal. Puede ser necesario usar la señal KILL (9), ya que esta señal no puede capturarse, en cuyo caso el estado de salida es 128 + 9 en lugar de 124.

ceving
fuente