Bash - faz algum trabalho infinito enquanto aguarda a tecla específica pressionada - possível?

6

Eu tenho o seguinte loop infinito no bash, executando do_some_simple_job a cada 10 minutos:

while true
do

    do_some_simple_job

    sleep 600

done

Eu gostaria que o script aceitasse alguns pressionamentos de teclas enquanto fazia esse trabalho, como para cancelar o trabalho, mas não terminar o script, isso é possível?

    
por Vlastimil 02.08.2016 / 10:44

1 resposta

19

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.

    
por 02.08.2016 / 11:05