O timeout
comando GNU coreutils é extremamente útil para determinadas situações de script, permitindo usar a saída de um comando se for rápido para executar e ignorá-lo se levar muito tempo.
Como posso aproximar o comportamento básico de timeout
usar apenas utilitários especificados POSIX?
(Eu estou pensando que pode envolver uma combinação de wait
, sleep
, kill
e quem sabe mais o quê, mas talvez eu estou faltando uma abordagem mais fácil.)
shell-script
posix
timeout
Curinga
fonte
fonte
command & pid=$! ; sleep 5 && kill $pid
command
terminar rapidamente, há uma pequena chance depid
ser reutilizado por outro processo iniciado antes dokill
comando ser executado? Eu não gostaria que no código de produção ....timeout
programa e usá-lo?Respostas:
Minha abordagem seria esta:
Executar comando como processo em segundo plano 1
Execute o "watchdog timer" como processo em segundo plano 2
Configure um manipulador para interceptar um sinal de terminação no shell pai
Aguarde a conclusão de ambos os processos. O processo que termina primeiro envia o sinal de término ao pai.
O manipulador de interceptação dos pais mata os dois processos em segundo plano por meio do controle de tarefas (um deles já foi finalizado por definição, mas essa interrupção será uma operação inofensiva porque não estamos usando PIDs, veja abaixo)
Tentei contornar a possível condição de corrida abordada nos comentários usando os IDs de controle de trabalho do shell (que seriam inequívocos nessa instância do shell) para identificar os processos em segundo plano a serem eliminados, em vez dos PIDs do sistema.
Resultado para
TIMEOUT=10
(o comando termina antes do cão de guarda):Resultado para
TIMEOUT=1
(o watchdog termina antes do comando):Resultado para
TIMEOUT=5
(watchdog e comando terminam "quase" simultaneamente):fonte
cleanup() { ...; }
e (b) o controle de tarefas é um recurso bash não especificado pelo POSIX (embora o ksh e outros o tenham também). Bom roteiro, no entanto!timeout="$1"; shift
e, em(exec "$@"; echo "Command completed"; kill $$)
vez de reexplicar a lista de argumentos.