Status de retorno do comando 'timeout' do Busybox

4

Estou escrevendo um script de shell que deveria funcionar em várias distribuições diferentes, algumas das quais estão usando busybox e outras não.

Este script usa o comando timeout para descobrir se um comando executado foi executado por mais de <time> ou não. No caso de distribuições que usam coreutils timeout , isso não é problema, porque quando timeout teve que matar um comando, ele sempre retorna 124 , então é simples.

Meu problema é que quando executo o mesmo em Alpine Linux (que usa busybox), o status de saída é 0 após o tempo limite ter que matar o comando, mas quando eu uso o comando timeout do busybox package no Ubuntu sai com 143 .

Por que os dois comandos timeout , ambos de busybox , me dão um valor de retorno diferente?

Existe alguma consistência ou regra em que eu possa usar para determinar se o comando expirou ou não?

    
por replay 16.10.2016 / 20:56

1 resposta

3

O Alpine Linux provavelmente tem uma versão anterior do busybox. Uma solução simples é adicionar ao seu comando original outro comando que tenha algum efeito colateral que você possa testar, por exemplo, escrevendo alguma saída para stdout ou um arquivo.

Por exemplo, supondo que você queira um tempo limite de 1 para um comando original de sleep 2 , em vez de

timeout 1 sleep 2

faça

ok=$(timeout 1 bash -c 'sleep 2; echo ok')

e teste $ok para ok. Obviamente, se o seu comando escreve para stdout, você precisa redirecioná-lo, por exemplo, dup para fd 3 e redirecionar para isso:

exec 3>&1
ok=$(timeout 1 bash -c 'my command >&3; echo ok')
exec 3>&-

ou faça o echo ok em um arquivo.

    
por 17.10.2016 / 17:37