Como desligar o Linux em um horário específico do terminal?

46

Parece que posso desligar usando sudo shutdown, especificando uma hora ou minutos.

Existe uma maneira de especificar data e hora para o desligamento?

Askar
fonte

Respostas:

78

Você pode fazer isso diretamente no shutdown command, consulte man shutdown:

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

[...]

   time   When to shutdown.

Então, por exemplo:

shutdown -h 21:45

Isso será executado shutdown -hàs 21:45.


Para comandos que não oferecem essa funcionalidade, você pode tentar um dos seguintes:

A. Usando em

O atdaemon foi projetado exatamente para isso. Dependendo do seu sistema operacional, pode ser necessário instalá-lo. Em sistemas baseados no Debian, isso pode ser feito com:

sudo apt-get install at

Existem três maneiras de dar um comando para at:

  1. Pipe it:

    $ 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. Salve o comando que você deseja executar em um arquivo de texto e passe esse arquivo para 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. Você também pode passar atcomandos do STDIN:

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

    Em seguida, pressione CtrlDpara sair do atshell. O lscomando será executado em um minuto.

Você pode dar tempos muito precisos no formato de [[CC]YY]MMDDhhmm[.ss], como em

$ at -t 201403142134.12 < script.sh

Isso executará o script script.shàs 21:34 e 12 segundos em 14 de março de 2014.

B. Usando cron (embora isso não seja uma boa ideia para desligar)

A outra abordagem é usar o cronagendador projetado para executar tarefas em horários específicos. Geralmente é usado para tarefas que serão repetidas, mas você também pode dar um tempo específico. Cada usuário possui seus próprios "crontabs", que controlam quais tarefas são executadas e quando. O formato geral de um 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)

Por exemplo, isso será executado lstodos os dias às 14:04:

04 14 * * * ls

Para configurar um cronjob para uma data específica:

  1. Crie um novo crontab executando crontab -e. Isso abrirá uma janela do seu editor de texto favorito.

  2. Adicione esta linha ao arquivo que acabou de abrir. Este exemplo em particular será executado às 14:34 de 15 de março de 2014 se esse dia for sexta-feira (então, ok, pode ser executado mais de uma vez):

    34 14 15 5  /path/to/command        
    
  3. Salve o arquivo e saia do editor.

Essa resposta do SO sugere uma maneira de executá-lo apenas uma vez, mas eu nunca o usei, portanto não posso atestar isso.

terdon
fonte
2
Programar um desligamento com cron é um péssimo hábito. De repente, você se perguntará por que o servidor está inativo toda segunda-feira de manhã.
Ouki 20/03/14
4
@ Ouki Desculpe, mas eu simplesmente não vejo onde eu recomendo o uso do cron para o desligamento. Menciono entre parênteses que é possível (é), mas não o recomendo. Temos a tendência de gostar de respostas abrangentes aqui, e é por isso que ofereci as outras alternativas, sem nunca sugerir que elas deveriam ser usadas shutdown. Sinto por essa experiência ruim que não poderia ter sido agradável.
terdon
2
Isso é mais uma sugestão, pois você está misturando shutdownagendamento e croncom a mesma resposta ... Se é uma estação de trabalho ou um servidor de correio de 1000 usuários (minha triste experiência), trata-se mais das consequências de um mau hábito.
Ouki 20/03/14
3
Estou com Ouki aqui. Ao discutir shutdown, não se deve incluir cron. (. esp com alguém que não sabe por que isso é uma idéia horrível.)
Ricky feixe
2
Estou um pouco confuso que essa resposta pareça levar com informações já assumidas pela pergunta. Parece que o OP sabe como especificar um horário para o encerramento, mas deseja saber como especificar uma data e um horário. Isso é abordado nesta resposta, mas é fornecido como se fosse uma informação extra, quando é o que está sendo solicitado em primeiro lugar.
21714 Weeble
24

Não, você não pode especificar uma data no comando shutdown, mas existem duas alternativas:

1) O mais fácil é usar o comando at . O exemplo a seguir será executado shutdown +5em um horário e dia específicos:

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

2) se você não se importa em usar sua calculadora e deseja desligar em, digamos, 24 horas (24 * 60 = 1440 minutos) e tem certeza absoluta de que o sistema não será reiniciado no meio:

shutdown -r +1440
ndemou
fonte
2
A razão para a minha resposta acima: A resposta de terdon está correto e muito abrangente mas muito falador (IMHO pelo menos)
ndemou
2
Se por tagarela você quer dizer útil e abrangente ... Sua resposta nem explicou o atcomando.
Anthony
@ Anthony Eu acredito que esta maneira de usar atnão merece explicação. Eu posso ver você acreditar no contrário. Mentes diferentes, visões diferentes.
Ndemou
Esta resposta não é mais verdadeira. Os shutdowncomandos van Smoorenburg, Upstart e systemd não permitem uma especificação de data. Mas o conjunto de ferramentas nosh shutdownfunciona, suportando a sintaxe de longa data do BSD.
JdeBP 7/01
@JdeBP: qual alternativa dos dois você acredita que não é mais verdadeira e você testou e verificou que não? Acabei de testar os dois comandos em 3 sistemas (Ubuntu 18.04, 16.04 e CentOS 7) e eles funcionaram bem. Em relação ao restante do seu comentário ("The van Smoorenburg ..."), não tenho certeza se é um esclarecimento de sua afirmação de que esta resposta não é mais verdadeira ou um comentário geral. Talvez você deva postar uma resposta com um pouco mais de informação.
ndemou 8/01
6

Ele encerrará o sistema às 12:00:

$ sudo shutdown -h 12:00

Opções:

-h, -P, --poweroff

Desligue a máquina.

-r, --reboot

Reinicie a máquina.

-c

Cancele um desligamento pendente.

Hamed Kamrava
fonte
5
Seu método não mostrando como desligamento em uma data específica ...
Askar