echo firstOutput
read -s
command0 &
sleep 8
command1a &
command1b &
command1c &
sleep 5
echo secondOutput
command2
Eu tenho um script de shell que se parece com isso:
echo firstOutput
read -s
command0
command1a
command1b
command1c
echo secondOutput
command2
command1a
, command1b
, command1c
são comandos individuais mas podem ser executados em ordem arbitrária e são um grupo no sentido da seguinte explicação.
Agora quero melhorar o script para que o script continue, mesmo se um comando ficar preso. command0
precisa ser executado primeiro e tem 8 segundos para operar. Se não chegar dentro de 8 segundos, o script continuará para command1[a-c]
, que juntos têm 5 segundos para operar. Se eles não terminarem dentro de 5 segundos, command2
será chamado. Apenas no caso de isso ser importante: command2
é o último comando deste script.
Edit: Para esclarecer: Eu sei como fazer um script que executa os comandos no tempo máximo permitido. No entanto, esses são tempos limite e quero que o script seja executado o mais rápido possível. O script inteiro geralmente é executado em uma fração de segundo depois que enter é pressionado (veja a linha read -s
).
echo firstOutput
read -s
command0 &
sleep 8
command1a &
command1b &
command1c &
sleep 5
echo secondOutput
command2
O comando timeout
faz exatamente o que você parece querer. Veja man timeout
:
NAME
timeout - run a command with a time limit
SYNOPSIS
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
DESCRIPTION
Start COMMAND, and kill it if still running after DURATION.