Estoy intentando programar la descarga por las noches. He creado un atd
trabajo que inicia la descarga del script a las 2 a.m. Ahora quiero detener el mismo trabajo a las 7 a.m. si todavía está ejecutándose. Lo que estoy haciendo ahora es simplemente shutdown -h 7:00
... ¿Es posible detener atd
el trabajo en un momento específico?
Respuesta1
No veo un mecanismo interno at
que le permita especificar una hora de parada. Simplemente programaría otro at
trabajo a las 7 a.m. que verificaría si alguno de estos trabajos todavía se está ejecutando y los eliminaría.
Respuesta2
At
Los trabajos se ejecutan utilizando un intérprete de shell (en Linux, normalmente es /bin/sh
). Significa que cualquier comando que vaya a ejecutar como at
trabajo puede ser rastreado mediante un número PID del shell que ejecutará ese comando. Simplemente puede capturar este PID con una variable de shell especial $$
. Puede guardarlo en un archivo (las comillas simples son obligatorias para no expandirlo en su shell de sesión actual):
at 'echo $$ > /var/run/my_at_job.pid; your_command; rm /var/run/my_at_jon.pid' | at TIME_SPEC
y luego, en otro at
trabajo, puede finalizar el trabajo y todos sus procesos secundarios generados ( 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
Respuesta3
Podrías incorporar el tiempo de espera en tu trabajo.
timeout "$(($(date +%s -d '7am') - $(date +%s)))" wget -c http://example.com/wibble
Alternativamente, haga que su trabajo escriba su ID de proceso en algún lugar para poder eliminarlo. En el trabajo de las 2 am:
echo $$ >~/.at.download.pid
wget -c http://example.com/wibble
rm ~/.at.download.pid
En el trabajo de las 7 am:
if [ -e ~/.at.download.pid ]; then
kill $(~/.at.download.pid)
rm ~/.at.download.pid
fi