`shutdown -k`ログインを無効にするには?

`shutdown -k`ログインを無効にするには?

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

 -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

答え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ログインを無効にしていると思う傾向がありますが、これは完全に間違っています。

ソースコードにバグがありますか?

shutdown.c@Gillesが残したコメントに基づいて、彼は特に次のURLのソースに私たちを導きました。http://packages.ubuntu.com/trusty/admin/upstart。現在、このshutdownユーティリティは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));

関数の内部には、閉じる前に5分未満が残っているときにファイルに書き込むように見えるtimer_callack()ブロックがあります。/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一度だけ警告した後に終了します。

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

ここで終了します。

  if (warn_only)
    exit (0);

関連情報