Как действительно 'завершает работу,-k' отключают логины?

Короче говоря, Вы не должны волноваться об этом, как разделение инструментов было несколько исправленных годы назад для обработки этого. Также "Усовершенствованный Формат" не имеет никакого отношения к GPT; только необходимо использовать это для дисков> 2 тебибайта или если Вы используете UEFI. Windows не поддерживает GPT без UEFI.

2
22.04.2014, 03:02
1 ответ

Использование из дистрибутива на базе Red Hat

Я считаю, что переключатель -k просто имитирует, что система выключается, и поэтому напечатает сообщение на стене, но мало что делает.

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

Чтобы отменить событие выключения:

$ sudo shutdown -c

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

Когда я попытался использовать описанное выше в Ubuntu 12.04, я смог выполнить следующую команду:

$ 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

Просмотр журнала strace файл, sdown.log Я не видел ничего, что могло бы указывать на то, что это имело какое-либо влияние на фактическую блокировку входа в систему от пользователей.

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

Поэтому я склонен думать, что страница руководства просто неверна в том смысле, что в ней говорится, что переключатель -k отключает вход в систему.

Ошибка в исходном коде выключения?

Согласно комментарию, оставленному @Gilles, он направил нас к источнику shutdown.c , в частности, с этого URL: http: // packages .ubuntu.com / trusty / admin / upstart . Утилита shutdown в настоящее время является частью пакета Upstart в Ubuntu и CentOS.

Просматривая исходный код, ./ util / shutdown.c обратите внимание, что файл, используемый для управления включением / отключением пользователей от входа в систему, это / etc / nologin , как вы и подозревали. Запись в этот файл выполняется только функцией timer_callback () .Затем эта функция вызывается этим таймером в качестве обратного вызова:

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

Внутри функции timer_callack () есть этот блок, который, по-видимому, записывает файл / etc / nologin , когда есть До выключения осталось <5 минут:

  /* 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);
    }
  }

Переключатель -k отправляет предупреждение только 1 раз, а затем закрывается.

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

Вот и выход:

  if (warn_only)
    exit (0);
3
27.01.2020, 22:06

Теги

Похожие вопросы