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 .