Предпосылки

Предпосылки

Мне нужно запускать скрипт Python каждый день в полночь, и после некоторых поисков в интернете я обнаружил, что я могу использовать cron для этого. Мне интересно, если я запланирую задачу cron на полночь, разбудит ли она мой компьютер для выполнения работы? Или мне нужно разбудить компьютер с помощью чего-то другого? Я использую Ubuntu 16.04.

решение1

Короткий ответ:

Нет.

Тыможетоднако используйтеrtcwake. С помощью rtcwake, вы можете разбудить компьютер, настроить его на последующий запуск команд и скриптов и т. д.

Варианты включают как пробуждение в абсолютное время, так и пробуждение в определенный промежуток времени.отныне:

-s seconds | --seconds seconds
    Sets the wakeup time to seconds in future from now. 
-t time_t | --time time_t
    Sets the wakeup time to the absolute time time_t. time_t is the time in seconds since 1970-01-01, 00:00 UTC. Use the 

Примером использования rtcwake может служитьэтот ответ.
См. также, как всегда,man rtcwake

решение2

Уже есть ответ, в котором упоминается, что вы можете использовать его rtcwakeдля этой цели, я хотел бы немного подробнее остановиться на этомкакты можешь это сделать.

Предпосылки

Сначала установите rtcwake(из util-linuxпакета) dmidecodeи anacron:

sudo apt install util-linux dmidecode anacron

Проверьте, может ли ваш компьютер выйти из режима ожидания:

sudo rtcwake -m mem -s 30

Это должно перевести ваш компьютер в режим ожидания и разбудить его через 30 секунд. (Я выбрал 30 секунд, потому что приостановка или переход в режим гибернации вашего компьютера может занять некоторое время, и если время пробуждения окажется раньше окончания процесса ожидания, пробуждение может не сработать.)

Вы можете попробовать другие методы перехода в режим ожидания mem, diskв частности, он обеспечивает большую экономию энергии, но зашифрованные системы не смогут выйти из него без ручного ввода пароля.

Если ваш компьютер успешно проснулся, проверьте, можно ли определить причину пробуждения:

sudo dmidecode | grep "Wake-up Type"

Если вы видите Wake-up Type: APM Timerрезультат, то все готово.

Пользовательский скрипт для приостановки

Если все предварительные условия выполнены, мы можем составить простой скрипт, который выполняет следующие действия:

  • Переводит компьютер в режим ожидания и одновременно устанавливает время пробуждения.
  • После пробуждения проверяет, было ли пробуждение запланированным или ручным.
  • Если пробуждение было запланировано, выполняет задания cron и возвращает компьютер в режим ожидания, устанавливая новое пробуждение.

Вот сценарий:

#! /bin/bash
# https://askubuntu.com/a/1323317
while true
do
  wake_at=22:05 # Set to whenever you want the cron jobs to run each day
  wake_ts="$(date -d "$wake_at" +%s)"
  now_ts="$(date +%s)"
  if [ "$wake_ts" -lt "$now_ts" ]
  then
    wake_ts="$(date -d "tomorrow $wake_at" +%s)"
  fi
  rtcwake -m mem -t "$wake_ts"

  # After wake-up
  #
  # Without this sleep, the current time would still seem to be the instant when
  # the suspend happened, confusing man and machine alike.
  sleep 1
  if dmidecode | grep -q "Wake-up Type: APM Timer"
  then
    # We trigger anacron manually. To prevent cron jobs from running during
    # active uptime, its systemd triggers need to be disabled.
    /usr/sbin/anacron -nd
  else
    exit 0
  fi
done

Этот скрипт должен быть запущен от имени пользователя root, поэтому я рекомендую установить пользователя root в качестве владельца и использовать sudoдля его запуска. Вы можете использовать механизм sudoers, чтобы сделать возможным его запуск без ввода пароля, но я не буду подробно останавливаться на этом, так как это уже описано во многих руководствах.

Чтобы сделать этот механизм более простым в использовании, я рекомендую установить горячую клавишу в вашей среде рабочего стола. Если вы это сделаете, вам следует использовать скрипт-обертку, который инструктирует вашу команду заставки, специфичную для среды рабочего стола, заблокировать экран, прежде чем она выполнит скрипт выше с помощью sudo.

Отключение обычных расписаний

Если вы хотите, чтобы задания cronтолькозапускаются в запланированное время пробуждения, а не во время активного аптайма компьютера, вам необходимо отключить их существующие расписания. В Ubuntu задания cron организованы в каталоги, но эти каталоги выполняются заданиями более низкого уровня в /etc/crontab:

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Вы можете видеть, что записи crontab, которые запускают ежедневные, еженедельные и ежемесячные задания, выполняются только в том случае, если anacron не установлен (с намерением, что anacron возьмет на себя задачу их выполнения в противном случае). Поскольку мы только что установили anacron, cron больше не будет автоматически запускать эти задания, но anacron будет, и нам нужно отключить это.

Сам Anacron также является запланированной задачей, запускаемой systemd. Чтобы отключить ее, выполните:

sudo systemctl mask --now anacron.service
sudo systemctl mask --now anacron.timer

Вместо того, чтобы mask, disableможет быть, достаточно, я нашел противоречивую информацию об этом в Интернете, ноmask можетпомочь предотвратить повторное включение отключенных элементов при обновлении пакета.

После этого ежедневные, еженедельные и ежемесячные задания cron не будут выполняться во время обычной работы компьютера, а будут выполняться только сценарием приостановки, представленным выше, и только после запланированных пробуждений.

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