Я пытаюсь запланировать загрузку на ночь. Я создал atd
задание, которое запускает скрипт загрузки в 2 часа ночи. Теперь я хочу остановить это же задание в 7 утра, если оно все еще выполняется. Сейчас я просто делаю shutdown -h 7:00
. Можно ли остановить atd
задание в указанное время?
решение1
Я не вижу механизма, at
который позволит вам указать время остановки. Я бы просто запланировал еще одно at
задание на 7 утра, которое бы проверяло, выполняются ли еще какие-либо из этих заданий, и убивало бы их.
решение2
At
Задания выполняются с использованием интерпретатора оболочки (в Linux это обычно /bin/sh
). Это означает, что любая команда, которую вы собираетесь запустить как at
задание, может быть отслежена по номеру PID оболочки, которая собирается запустить эту команду. Вы можете просто перехватить этот PID с помощью специальной переменной оболочки $$
. Вы можете сохранить его в файле (одинарные кавычки обязательны, чтобы не расширять его в вашей текущей сессии shell):
at 'echo $$ > /var/run/my_at_job.pid; your_command; rm /var/run/my_at_jon.pid' | at TIME_SPEC
и позже, в другом at
задании, вы можете завершить задание и все его порожденные дочерние процессы ( 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
решение3
Вы можете включить этот тайм-аут в свою работу.
timeout "$(($(date +%s -d '7am') - $(date +%s)))" wget -c http://example.com/wibble
В качестве альтернативы, пусть ваша работа запишет свой идентификатор процесса где-нибудь, чтобы вы могли его завершить. В работе в 2 часа ночи:
echo $$ >~/.at.download.pid
wget -c http://example.com/wibble
rm ~/.at.download.pid
На работе в 7 утра:
if [ -e ~/.at.download.pid ]; then
kill $(~/.at.download.pid)
rm ~/.at.download.pid
fi