Não vejo um mecanismo dentro de at
para permitir que você especifique um horário de término. Eu apenas agendaria outro trabalho at
às 7h que verificaria se algum desses trabalhos ainda estava em execução e os mataria.
Estou tentando agendar o download à noite. Eu criei um trabalho atd
que inicia o script de download às 2:00. Agora eu quero parar o mesmo trabalho às 7 da manhã, se ainda estiver funcionando. O que estou fazendo agora é apenas shutdown -h 7:00
. É possível interromper o trabalho atd
no tempo especificado?
At
jobs são executados usando um interpretador de shell (no Linux, geralmente é /bin/sh
). Isso significa que qualquer comando que você executar como at
job poderá ser rastreado por um número PID do shell que executará esse comando. Você pode simplesmente capturar este 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 de 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 trabalho at
, você pode matar o trabalho e todos os 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
Você pode incorporar o tempo limite no seu trabalho.
timeout "$(($(date +%s -d '7am') - $(date +%s)))" wget -c http://example.com/wibble
Como alternativa, peça ao seu trabalho para escrever seu ID de processo em algum lugar para que você possa eliminá-lo. No trabalho das 2 da manhã:
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
Tags scheduling at