Se idql usa o tempo de CPU em um loop quando é interrompido, você pode limitar o tempo total da CPU:
( ulimit -t 5;
idql -n $REPOSITORY_NAME.$cs -Udmadmin -P"" -R$DM_SCRIPTS/test.api > /dev/null 2>&1 )
Se idql for bloqueado por algum outro motivo (por exemplo, um deadlock), você terá que fazer esse tempo limite na hora do relógio de parede. Aqui está uma solução devido a Stéphane Gimenez , ligeiramente adaptado para obter o status de saída do comando idql .
ret=$(sh -ic '{ { idql -n "$REPOSITORY_NAME.$cs" -Udmadmin -P"" -R"$DM_SCRIPTS/test.api" > /dev/null 2>&1;
echo $? >&3;
kill 0; } |
{ sleep 5; kill 0; } }' </dev/null 3>&1 2>/dev/null)
if [ -z "$ret" ]; then
echo "timed out"
elif [ "$ret" -ne 0 ]; then
echo "error $ret"
else
echo "ok"
fi
Explicação:
- Inicie um shell interativo (
sh -i ). Como esse shell é interativo, ele está em seu próprio grupo de processos .
- O subshell executa dois comandos conectados juntos. Isso permite que ambos os comandos sejam executados em paralelo dentro do mesmo grupo de processos.
- Ambos os comandos terminam com
kill 0 , que mata todos dentro do grupo de processos. Qualquer comando que termine primeiro ( idql ou sleep ) irá matar o outro.
- Imprime o status de retorno de
idql no descritor de arquivo 3, para que ele não passe pelo canal. O descritor de arquivo 3 é redirecionado para o descritor de arquivo 1 no shell externo, para que a saída desse fd seja capturada pela substituição do comando.
- Redirecione o erro padrão do shell interativo para
/dev/null para não exibir nenhuma mensagem "Terminada" do shell interno. Se você quiser ver a saída de erro de idql , precisará redirecioná-la ( idql 2>&4 em vez de idql 2>/dev/null e adicionar 4>&2 antes do 2>/dev/null de sh -i ).
- Redireciona a entrada padrão do shell interativo de
/dev/null para que ele não acabe lendo os comandos do terminal se você pressionar Ctrl + C .