Você pode executar um processo que enviará um sinal (por exemplo, SIGALRM
) para o script de shell a cada x tempo e usará uma interceptação para esse sinal. Esse processo pode ser um script fazendo algo como:
set -e
while true
do
sleep 300
kill -ALRM $PPID
done
se iniciado pelo script de shell principal.
O script de shell principal deve eliminar esse processo quando não for mais necessário, e / ou o processo deve terminar quando o pid não existir mais (no entanto, há uma condição de corrida sobre isso).
Nota: se o script de shell principal usar o comando sleep
, ele interagirá com o sinal ALRM
, mas você poderá usar SIGUSR1
ou SIGUSR2
.
Aqui está um exemplo usando um subshell. Para tornar o comportamento mais fácil de ver, substituí o período de 5 minutos ( sleep 300
) por um período de 5 segundos ( sleep 5
).
#!/bin/sh
{
set -e
while true
do
sleep 5
# Since this is run as a subshell (instead of an external command),
# the parent pid is $$, not $PPID.
kill -USR1 $$
done
} &
trap 'echo "Signal USR1 received."' USR1
while true
do
date
sleep 1
done
O script pode ser interrompido com Ctrl-C. Ele não mata o subshell quando isso acontece, mas se o pid não for reutilizado, o subshell terminará automaticamente depois de não mais do que o período (aqui, 5 segundos) porque o comando kill
falha ( kill: No such process
). / p>