-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
。
- ログインを無効にする方法は
shutdown -k
? - 後でログインを再度有効にするにはどうすればよいですか
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);