Как выключить Linux в определенное время с терминала?


46

Кажется, я могу отключиться sudo shutdown, указав время или минуты.

Есть ли способ указать дату и время для выключения?

Ответы:


78

Вы можете сделать это прямо из shutdown command, см man shutdown:

SYNOPSIS
   /sbin/shutdown [-akrhPHfFnc] [-t sec] time [warning message]

[...]

   time   When to shutdown.

Так, например:

shutdown -h 21:45

Это будет работать shutdown -hв 21:45.


Для команд, которые не предлагают эту функцию, вы можете попробовать один из:

А. Использование в

atДемон предназначен для именно это. В зависимости от вашей ОС, вам может потребоваться установить его. В системах на основе Debian это можно сделать с помощью:

sudo apt-get install at

Есть три способа дать команду at:

  1. Труба это:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. Сохраните команду, которую хотите запустить, в текстовом файле, а затем передайте этот файл at:

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. Вы также можете передавать atкоманды из STDIN:

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    Затем нажмите CtrlDдля выхода из atоболочки. Команда lsбудет выполнена через одну минуту.

Вы можете дать очень точное время в формате [[CC]YY]MMDDhhmm[.ss], как в

$ at -t 201403142134.12 < script.sh

Это запустит сценарий script.shв 21:34 и 12 секунд 14 марта 2014 года.

B. Использование cron (хотя это не очень хорошая идея для выключения)

Другой подход заключается в использовании cronпланировщика, который предназначен для выполнения задач в определенное время. Обычно он используется для задач, которые будут повторяться, но вы также можете указать определенное время. У каждого пользователя есть свои «crontabs», которые контролируют, какие задания выполняются и когда. Общий формат crontab:

*     *     *     *     *  command to be executed
-     -     -     -     -
|     |     |     |     |
|     |     |     |     +----- day of week (0 - 6) (Sunday=0)
|     |     |     +------- month (1 - 12)
|     |     +--------- day of month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

Так, например, это будет выполняться lsкаждый день в 14:04:

04 14 * * * ls

Чтобы настроить cronjob на определенную дату:

  1. Создайте новый crontab, запустив crontab -e. Откроется окно вашего любимого текстового редактора.

  2. Добавьте эту строку в файл, который только что открылся. Этот конкретный пример будет запущен в 14:34 15 марта 2014 года, если этот день будет пятницей (так что, может, он будет выполнен несколько раз):

    34 14 15 5  /path/to/command        
    
  3. Сохраните файл и выйдите из редактора.

Этот SO ответ предлагает способ запустить его только один раз, но я никогда не использовал его, поэтому я не могу ручаться за это.


2
Планирование выключения с помощью cron - очень плохая привычка. Внезапно вы будете удивляться, почему сервер не работает каждый понедельник утром.
Ouki

4
@ Ouki Извините, но я просто не понимаю, где я рекомендую использовать cron для выключения. Я упоминаю в скобках, что это возможно (это так), но не рекомендую это. Нам, как правило, здесь нравятся исчерпывающие ответы, поэтому я предложил другие альтернативы, не предлагая их использовать shutdown. Я чувствую к этому плохому опыту, хотя, это не могло быть приятным.
Terdon

2
Это больше о предложении, так как вы смешиваете shutdownпланирование и один и cronтот же ответ ... Будь то рабочая станция или почтовый сервер на 1000 пользователей (мой печальный опыт) больше о последствиях плохой привычки.
Ouki

3
Я здесь с Оуки. При обсуждении shutdownне следует включать cron. (особенно с кем-то, кто не знает, почему это ужасная идея.)
Рикки Бим

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

24

Нет, вы не можете указать дату в команде выключения, но существует две альтернативы:

1) Самое простое - использовать команду at . Следующий пример будет выполнен shutdown +5в определенное время и день:

echo "shutdown +5" | at 10:05am 2019-01-19

2) если вы не возражаете против использования калькулятора и хотите завершить работу, скажем, в течение 24 часов (24 * 60 = 1440 минут), и вы абсолютно уверены, что система не перезагрузится между ними:

shutdown -r +1440

2
Причина моего ответа выше: ответ Тердона правильный и очень исчерпывающий, но слишком болтливый (по крайней мере, ИМХО)
ndemou

2
Если под болтливым вы подразумеваете услужливый и исчерпывающий ... Ваш ответ даже не объяснил atкоманду.
Энтони

@ Энтони Я считаю, что этот способ использования не atзаслуживает объяснения. Я вижу, ты веришь иначе. Разные умы, разные взгляды.
ndemou

Этот ответ больше не соответствует действительности. Команды van Smoorenburg, Upstart и systemd shutdownне позволяют указывать дату. Но это shutdownделает набор инструментов nosh , поддерживающий давний синтаксис BSD.
JdeBP

@JdeBP: какая альтернатива из этих двух, по вашему мнению, больше не соответствует действительности, и вы проверили и подтвердили, что это не так? Я только что протестировал обе команды в 3 системах (Ubuntu 18.04, 16.04 и CentOS 7), и они отлично работали. Что касается остальной части вашего комментария («Ван Смуренбург ...»), я не уверен, является ли это разъяснением вашего заявления о том, что этот ответ больше не является правдой или общим комментарием. Может быть, вы должны опубликовать ответ с более подробной информацией.
Ндему

6

Это отключит вашу систему в 12:00:

$ sudo shutdown -h 12:00

Опции:

-h, -P, --poweroff

Выключите машину.

-r, --reboot

Перезагрузите машину.

-c

Отмените ожидающее выключение.


5
Ваш метод не показывает, как завершить работу на определенную дату ...
Аскар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.