Отключить компьютер в заданное время

Отключить компьютер в заданное время

09.07.2019 10:15:12 Просмотров 25 Источник

Я хочу, чтоб моя Ubuntu автоматически отключалась каждый день в определенное время. Как этого можно добиться?

У вопроса есть решение - Посмотреть?

Ответы - Отключить компьютер в заданное время / Отключить компьютер в заданное время

user244413

09.07.2019 10:15:12

На помощь нам придет юниксный демон по имени cron.
Для того, чтобы поставить задачу в расписание, мы добавим ее в файл /etc/crontab.
Открываем терминал — Ctrl Alt T.
Файл можно редактировать такой командой:

sudo nano /etc/crontab 

Для отключения компьютера каждый день в 23:03 добавим в файл такую строчку:

03 23 * * * root shutdown -h now

Последняя строчка файла должна быть пустая.

Эта часть была написана по мотивам askubuntu.

Объяснение подробнее.

(Обновлено)

В самом этом файле /etc/crontab объясняется формат таблицы задач:

# m h dom mon dow user  command

Первые два поля — минута и час запуска задачи,
3-е поле (dom) — день месяца (Day of Month),
затем месяц,
5-е поле (dow) — день недели,
затем пользователь, от чьего имени будет запускаться команда,
и, собственно, команда.

Время запуска
Все условия (времени запуска) проверяются по «логическому И», кроме условий «день недели» и «день месяца» — указанные совместно, они обрабатываются по «логическому ИЛИ», то есть «по любому из дней», что отражено в документации (Ubuntu, Debian, FreeBSD). (См. Википедия, man 5 crontab). Если вы хотите проверять их по «логическому И», делайте это в самой команде.

Например, перезагрузка в пятницу, 13-го:

0 0 13 * * root [ "$(date '+\%u')" -eq 5 ] && shutdown -r now

Crontab пользователя.
Кроме общей таблицы crontab, каждый пользователь имеет свою. Свою личную таблицу можно редактировать командой

crontab -e

Таблицу другого пользователя, например, 'root'-а, можно редактировать командой

sudo crontab -u root -e

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

Спасибо господам 0andriy и Sergey, который привлекли мое внимание к такой возможности.

Обратите внимание, что в таблице конкретного пользователя формат задачи немного другой, там не нужно указывать пользователя. Вместо

03 23 * * * root shutdown -h now

нужно писать

03 23 * * *  shutdown -h now

Переменные окружения
Популярная причина проблем с работой crontab -- другое определение переменных окружения при работе демона cron, особенно переменной $PATH.
Вы можете узнать переменные окружения cron-а, вставив в crontab строчку

* * * * * env > /tmp/env.output

После того, как файл /tmp/env.output создан, эту строчку можно убрать.
Оказывается, в Ubuntu cron запускается с PATH=/usr/bin:/bin. Для корректной работы нужно определить правильный $PATH в самом файле crontab.
Обратите внимание, что значение переменных не подставляется, то есть

PATH = $HOME/bin:$PATH

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

Если вы запускаете программы с GUI, вам также надо определить $DISPLAY:

DISPLAY=:0

Да, и не забывайте в конце crontab-а вставлять пустую строчку.

Вторая часть ответа была написана по мотивам вопроса о проблемах работы с crontab-ом на askubuntu.
Спасибо всем комментаторам за плодотворную дискуссию.

https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1694278_1001186
Зачем sudo там, где это не требуется?
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1694502_1001186
@0andriy без sudo файл /etc/crontab открывается только на чтение.
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1694520_1001186
А кто вам говорит, что нужно использовать /etc/crontab? Нет, нет, про cron и в целом идея правильная.
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1695183_1001186
@0andriy если у вас есть другое решение, оформите его как ответ. Вдруг кому-то подойдет? Вдруг мне подойдет больше, чем cron?
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1695291_1001186
Решение у вас написано, только root не нужен. Учимся пользоваться Unix’ом вместе!
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1696197_1001186
А почему не sudo crontab -e?
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1696251_1001186
@0andriy только root не нужен. В самом деле?! А вот команда $ ls -l /etc/crontab говорит нечто совсем другое: -rw-r--r-- 1 root root 722 апр 6 2016 /etc/crontab. И по стилю. Учимся пользоваться Unix’ом вместе! - это Вы кому адресуете?
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1696438_1001186
@Sergey, в самом деле. Почитайте в конце концов документацию, не надо демонстрировать своё невежество.
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1696480_1001186
@0andriy Почитайте в конце концов вывод команды $ ls -l /etc/crontab , Вы знаете, что означают биты rw-r--r-- ? Не надо демонстрировать своё хамство.
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1696528_1001186
@Sergey, я знаю, что означает вывод команды ls -l, также я знаю, что означает опция -u, передаваемая в команду crontab.
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1697576_1001186
@0andriy Ввожу: > crontab -u root и получаю: must be privileged to use -u. Вы знаете какой-то другой способ получения рядовым пользователем привилегий рута, кроме команды sudo?
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1697606_1001186
@Sergey, ещё раз, root не нужен, зачем вы издеваетесь над Unix? Есть пользовательская таблица, там и пишите.
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1698017_1001186
@0andriy шатдаун не выполнится не интерактивно в современной системе.
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1698018_1001186
@user244413 зачем извращение с датой когда есть пятая звездочка (dow)?)
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1699182_1001186
Вся часть ответа, начиная со строчки «Переменные окружения», совершенно не относится к вопросу. Выключение компьютера не использует каких-то особенных переменных окружения и уж точно никак не относится к GUI (не считая выключения иксов).
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1699430_1001186
@andreymal, $ which shutdown дает /sbin/shutdown. Вставить одну строчку в /etc/crontab -- самое простое решение, потому что там уже выставлен '$PATH. А вот с 'crontab -e мне пришлось долго разбираться, пока он заработал, и выводы попали в ответ.
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1699433_1001186
@erl написано под заголовком Время запуска
https://ru.stackoverflow.com/questions/1001185/%d0%9e%d1%82%d0%ba%d0%bb%d1%8e%d1%87%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80-%d0%b2-%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/1001186#comment1699480_1001186
@user244413 ну в /etc/crontab PATH всё-таки нормальный, а выключать компьютер (особенно сервер) не рутом это как-то странно и вообще запрещено в некоторых окружениях
Является ответом!
andreymal

16.07.2019 11:52:24

Зачем трогать крон в системе с божественным systemd? :)

В systemd одним из способов выключения компьютера является включение службы systemd-poweroff, которая запускает команду /bin/systemctl --force poweroff, которая понятно что делает.

Сделаем таймер для запуска этой службы по расписанию, создав файл /etc/systemd/system/systemd-poweroff.timer (под рутом, разумеется):

[Timer]
OnCalendar=*-*-* 23:03:00

[Install]
WantedBy=timers.target

(Формат даты ДеньНедели Год-Месяц-День Часы:Минуты:Секунды, день недели писать необязательно, звёздочка означает любое значение.)

Запустим его (таймер, а не выключение):

sudo systemctl start systemd-poweroff.timer

И добавим в автозагрузку, чтобы каждый раз вручную не запускать:

sudo systemctl enable systemd-poweroff.timer

Теперь этот таймер будет каждый день в 23:03 запускать ту службу, которая написана в имени файла — systemd-poweroff — и тем самым выключать компьютер.

С помощью команды sudo systemctl status systemd-poweroff.timer можно посмотреть информацию о таймере: точное время следующего запуска, оставшееся время и так далее:

$ sudo systemctl status systemd-poweroff.timer
* systemd-poweroff.timer
   Loaded: loaded (/etc/systemd/system/systemd-poweroff.timer; enabled; vendor preset: enabled)
   Active: active (waiting) since Tue 2019-07-16 11:34:01 MSK; 10min ago
  Trigger: Tue 2019-07-16 23:03:00 MSK; 11h left

Jul 16 11:34:01 home systemd[1]: Started systemd-poweroff.timer.

Если вы отредактировали файл (например, изменили время), нужно выполнить sudo systemctl daemon-reload для применения изменений.

Подробнее про таймеры можно почитать на арчевики.

Закрыть X