Мне нужно запускать скрипт 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 не будут выполняться во время обычной работы компьютера, а будут выполняться только сценарием приостановки, представленным выше, и только после запланированных пробуждений.