Como o 'shutdown -k' desabilita logins?

2

Esta é a documentação da opção -k em man shutdown (pelo menos no Ubuntu):

 -k   Only send out the warning messages and disable 
      logins, do not actually bring  the  system down.

Inicialmente, assumi que isso usaria pam_nologin para bloquear logins. No entanto, eu testei e não vejo /etc/nologin criado depois de executar shutdown -k .

  1. Como o shutdown -k desativa os logins?
  2. Como você pode reativar logins após um shutdown -k ?
por Belmin Fernandez 21.04.2014 / 11:56

1 resposta

3

Uso de uma distro baseada no Red Hat

Acredito que a opção -k apenas falsifica que o sistema está sendo encerrado e, portanto, imprimirá a mensagem na parede, mas faz pouco mais.

   -k
       Don't halt, power-off, reboot, just write wall message.

Para cancelar um evento de desligamento:

$ sudo shutdown -c

Uso do Ubuntu

Quando tentei usar o acima no Ubuntu 12.04, consegui fazer o seguinte comando:

$ sudo -i
$ strace -s 2000 -o sdown.log shutdown -k 23:00

Broadcast message from manny@manny
    (/dev/pts/1) at 20:25 ...

The system is going down for maintenance in 155 minutes!

$ shutdown -c
shutdown: Cannot find pid of running shutdown

Examinando o arquivo de log strace , sdown.log , não vi nada que parecesse indicar que ele tinha algum efeito em bloquear os logins dos usuários.

$ grep open sdown.log
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnih.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnih-dbus.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en_US.UTF-8/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en_US.utf8/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en_US/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en.utf8/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en/LC_MESSAGES/upstart.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/var/run/shutdown.pid", O_RDONLY) = -1 ENOENT (No such file or directory)

Então, eu estaria inclinado a pensar que a página do manual está simplesmente errada na forma como está dizendo que a opção -k desativará os logins.

Um bug na fonte do desligamento?

Por um comentário deixado por @Gilles, ele nos direcionou para a fonte de shutdown.c , especificamente desta URL: link . O utilitário shutdown faz parte do pacote Upstart no Ubuntu & CentOS atualmente.

Olhando pela fonte, ./util/shutdown.c observe que o arquivo usado para controlar se os usuários estão habilitados / desabilitados no login é /etc/nologin , como você suspeitava. Este arquivo só é gravado a partir da função timer_callback() . Esta função é então chamada como um retorno de chamada por este temporizador:

  /* Call a timer every minute until we shutdown */
  NIH_MUST (nih_timer_add_periodic (NULL, 60,
            (NihTimerCb)timer_callback,
            message));

Na função timer_callack() , há esse bloco que parece gravar o arquivo /etc/nologin quando houver < 5 minutos antes de desligar:

  /* Write /etc/nologin with less than 5 minutes remaining */
  if (delay <= 5) {
    FILE *nologin;

    nologin = fopen (ETC_NOLOGIN, "w");
    if (nologin) {
      fputs (msg, nologin);
      fclose (nologin);
    }
  }

O comutador, -k , envia a advertência 1 e sai.

  { 'k', NULL, N_("only send warnings, don't shutdown"),
    NULL, NULL, &warn_only, NULL },

Aqui está saindo:

  if (warn_only)
    exit (0);
    
por 21.04.2014 / 12:20