web-dev-qa-db-ja.com

`shutdown -k`はどのようにログインを無効にしますか?

これは、 -k (少なくともUbuntuでは)のman shutdownオプションのドキュメントです。

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

私は当初、これがpam_nologinを使用してログインをロックアウトすると想定していました。ただし、テストしたところ、/etc/nologinの実行後にshutdown -kが作成されていません。

  1. shutdown -kはどのようにログインを無効にしますか?
  2. shutdown -kの後にログインを再度有効にするにはどうすればよいですか?
2

RedHatベースのディストリビューションからの使用

_-k_スイッチは、システムがシャットダウンしていることを偽って、ウォールメッセージを出力すると思いますが、それ以外はほとんど実行しません。

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

シャットダウンイベントをキャンセルするには:

_$ Sudo shutdown -c
_

Ubuntuからの使用法

上記をUbuntu12.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_スイッチがログインを無効にするという言い回しのようにmanページが単に間違っていると思う傾向があります。

シャットダウンのソースのバグ?

@Gillesが残したコメントによると、彼は_shutdown.c_のソース、具体的には次のURLから私たちに指示しました: http://packages.ubuntu.com/trusty/admin/upstartshutdownユーティリティは、現在UbuntuとCentOSのUpstartパッケージの一部です。

ソースを見ると、_./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()関数内から、シャットダウンするまでの残り時間が5分未満の場合、_/etc/nologin_ファイルを書き込むように見えるこのブロックがあります。

_  /* 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
slm