Estou tentando agendar o download à noite. Eu criei um atd
trabalho que inicia o script de download às 2h. Agora quero interromper o mesmo trabalho às 7h, se ele ainda estiver em execução. O que estou fazendo agora é apenas shutdown -h 7:00
. É possível interromper atd
o trabalho em um horário especificado?
Responder1
Não vejo um mecanismo at
que permita especificar um horário de parada. Eu apenas agendaria outro at
trabalho às 7h para verificar se algum desses trabalhos ainda está em execução e matá-los.
Responder2
At
os trabalhos são executados usando um interpretador de shell (no Linux, geralmente é /bin/sh
). Isso significa que qualquer comando que você executar como at
trabalho pode ser rastreado por um número PID do shell que executará esse comando. Você pode simplesmente capturar esse PID com uma variável de shell especial $$
. Você pode salvá-lo em um arquivo (aspas simples são obrigatórias para não expandi-lo no shell da sessão atual):
at 'echo $$ > /var/run/my_at_job.pid; your_command; rm /var/run/my_at_jon.pid' | at TIME_SPEC
e mais tarde, em outro at
trabalho, você pode encerrar o trabalho e todos os seus processos filhos gerados ( you_command
):
if [ -r /var/run/at_job.pid ]; then
for PID in $(ps --ppid `cat /var/run/at_job.pid` -o pid | sed -e '1d'); do
kill $PID
done
fi
Responder3
Você pode incorporar o tempo limite em seu trabalho.
timeout "$(($(date +%s -d '7am') - $(date +%s)))" wget -c http://example.com/wibble
Como alternativa, faça com que seu trabalho escreva o ID do processo em algum lugar para que você possa eliminá-lo. No trabalho das 2h:
echo $$ >~/.at.download.pid
wget -c http://example.com/wibble
rm ~/.at.download.pid
No trabalho das 7h:
if [ -e ~/.at.download.pid ]; then
kill $(~/.at.download.pid)
rm ~/.at.download.pid
fi