Valor de retorno da função Timeout

9

Estou usando a função timeout no debian para esperar 5 segundos pelo meu script. Funciona muito bem, mas o problema que tenho é que preciso de um valor de retorno. Como 1 por tempo limite e 0 por tempo limite Como vou fazer isso?

Dê uma olhada no meu código:

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

Como você vê meu connect_script -x 'status' retorna o status como uma string e imprime na tela (provavelmente você não pode ver isso). O problema é que, se o servidor (para connect_script) estiver congelado, o script não fará nada. . É por isso que eu preciso do tempo limite para isso. E quando chega o tempo limite, quero reiniciar o servidor. Eu posso fazer isso, mas não tenho idéia de como posso ver se o tempo limite está ou não ...

Zero
fonte

Respostas:

19

Se timeoutatingir o tempo limite, sai com o status 124 ; você pode verificar isso para determinar se o script expirou ou não.

Stephen Kitt
fonte
Sim obrigado. Sinto falta disso no manual. @ Christopher postar uma resposta que funciona para mim. Eu não sei o $? sintaxe. Assim, ambas as respostas estão bem;)
Zero
6

De acordo com o manual ( man timeout):

Tempo limite da sinopse [OPTION] NUMBER [SUFFIX] COMMAND [ARG] ...

[...] Se o comando atingir o tempo limite, saia com o status 124. Caso contrário, saia com o status de COMMAND

Combine isso com o conhecimento de que o status de saída ou o valor de retorno está armazenado na variável,, $?e temos ...

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

Em seguida, você pode fazer mais processamento com base no valor de $RETVAL, que será 124 se atingir o tempo limite ou em algum outro valor com base no status de saída de connect_script.

Christopher
fonte
1

O valor de retorno timeoutdepende do sinal que você usa para finalizar o filho.

SIGTERM retorna 124:

timeout -s SIGTERM 1 sleep 2; echo $?

Mas SIGKILLretorna 137:

timeout -s SIGKILL 1 sleep 2; echo $?

Veja a página do manual:

Se o comando atingir o tempo limite e --preserve-status não estiver definido, saia com o status 124. Caso contrário, saia com o status de COMMAND. Se nenhum sinal for especificado, envie o sinal TERM após o tempo limite. O sinal TERM mata qualquer processo que não bloqueie ou capte esse sinal. Pode ser necessário usar o sinal KILL (9), pois esse sinal não pode ser capturado; nesse caso, o status de saída é 128 + 9 em vez de 124.

ceving
fonte