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);