Sim, isso é possível.
#!/bin/sh
sigint_handler () {
echo "Killing the job ($job_pid)"
kill $job_pid
}
while true; do
some_simple_job & job_pid=$!
trap 'sigint_handler' INT
echo "Job started ($job_pid)"
wait
trap - INT
echo "Job finished, waiting 10 minutes..."
sleep 600
done
Esse script sh
(também funciona em bash
, ksh93
e outros shells compatíveis) contém seu loop infinito. Depois de lançar o trabalho em segundo plano, ele instala um manipulador de sinal , uma pequena rotina que deve ser executada sempre que o script capturar um sinal específico. O sinal capturado é o sinal INT
(interrupção), que você envia pressionando Ctrl + C .
O script aguarda a conclusão do trabalho e, em seguida, ele dorme por 10 minutos (como faz o seu script). Antes de dormir, ele desinstala o manipulador de sinal para que você possa interromper o script com Ctrl + C .
Se um sinal INT
entrar enquanto o trabalho estiver em execução, o manipulador de sinais eliminará o trabalho usando seu ID de processo. O script será então atualizado para desinstalar o manipulador e suspender.
Se você não sair do script durante os 10 minutos de inatividade, o loop continuará com a inicialização do trabalho e a instalação do manipulador novamente.