A partir da discussão nos comentários abaixo da pergunta ficou claro que o que o OP quer é essencialmente pausar a função de background. Citação:
@ serg, o objetivo principal é deixar esse código funcionar como um interromper. Em vários pontos do programa eu preciso desativar o "interromper" e em vários pontos eu preciso ativá-lo. (não é um evento de tempo.)
É possível fazer isso com -SIGSTOP
e -SIGCONT
. Estes dois sinais são essencialmente pausa e botões de reprodução de um processo. Abaixo está o script de demonstração modificado do que eu postei originalmente. Essencialmente, eu criei a função infinita como um processo em segundo plano, e primeiro envie -SIGSTOP
e, em seguida, -SIGCONT
para ela. O grande ponto importante aqui é que o processo em segundo plano continuará a rodar mesmo que o processo principal saia, então no meu exemplo abaixo a interrupção não iria parar de enviar para o console, a menos que eu emitisse kill 1234
de outro terminal, onde 1234 é a função PID relatada do script. Então cuidado com isso
$ ./someInfiniteLoop.sh
We are in the main, about to spawn the interrupt function
Parent process (the script itself) 7119
Captured 7120
>>>> HEY I'M THE 1 SECOND INTERRUPT
>>>> HEY I'M THE 1 SECOND INTERRUPT
>>>> HEY I'M THE 1 SECOND INTERRUPT
Sending SIGSTOP to 7120
Funciton paused; waiting 3 seconds
You could do something else when function is paused
Function resumed
>>>> HEY I'M THE 1 SECOND INTERRUPT
>>>> HEY I'M THE 1 SECOND INTERRUPT
>>>> HEY I'M THE 1 SECOND INTERRUPT
Código-fonte do script de demonstração:
#!/bin/bash
# use the line bellow if you want to silence error messages
# exec 2>/dev/null
endless()
{
while true
do
echo ">>>> HEY I'M THE 1 SECOND INTERRUPT"
sleep 1
done
}
echo 'We are in the main, about to spawn the interrupt function'
echo "Parent process (the script itself) $$"
endless &
endless_pid="$!"
echo "Captured $endless_pid"
sleep 3
echo 'Sending SIGSTOP to ' $endless_pid
kill -SIGSTOP $endless_pid
[ $? -eq 0 ] && echo 'Funciton paused; waiting 3 seconds' || echo 'Something is wrong'
echo 'You could do something else when function is paused'
sleep 3
kill -SIGCONT $endless_pid
[ $? -eq 0 ] && echo 'Function resumed' || echo 'Something is wrong'
sleep 3 && exit 0
Você pode querer ler também: