остановка работы atd в указанное время

остановка работы atd в указанное время

Я пытаюсь запланировать загрузку на ночь. Я создал 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

Связанный контент