web-dev-qa-db-ja.com

systemctlはシステムのシャットダウンをどのようにスケジュールしますか?

shutdown -h +30と入力すると、Linuxはどういうわけかランレベルの変更を30分以内にスケジュールします。 Debianでは、/sbin/shutdown/bin/systemctlへのシンボリックリンクです。私のテストでは、 shutdownnotcron も-も使用しないことが示されています systemdタイマー

システムのシャットダウンはsystemdによってどのように実装されますか?

12
patryk.beza

良い質問。私はあなたが試したに違いないことに気付いたものを試しました-シャットダウンをスケジュールし、systemdタイマーを照会します!

あなたが指摘したように、それはシャットダウンがsystemdタイマーになかったことを示しました。したがって、systemctlソースをざっと見ると、halt_main()の一部としてこの呼び出しが得られます。

r = sd_bus_call_method(
                       b,
                       "org.freedesktop.login1",
                       "/org/freedesktop/login1",
                       "org.freedesktop.login1.Manager",
                       "ScheduleShutdown",
                       &error,
                       NULL,
                       "st",
                       arg_action == ACTION_HALT     ? "halt" :
                       arg_action == ACTION_POWEROFF ? "poweroff" :
                       arg_action == ACTION_KEXEC    ? "kexec" :
                                                       "reboot",
                       arg_when);

systemctl.c line 7387

したがって、シャットダウンは logind によって処理されるように見えます。必要に応じて、詳細を引き続き追求できます login-dbus.c を参照してください。シャットダウンのスケジューリング、キャンセル、管理のための方法があります。しかし、より深く理解するために、私よりもlogind/systemdについてもっと知る必要があるかもしれません。

簡単に言うと、シャットダウン情報は(少なくとも)/run/systemd/shutdown/scheduledのスケジュールファイルに保存されます。例として、私の内容は次のとおりです。

USEC=1435715559055789
WARN_WALL=1
MODE=poweroff

時間の表示(おそらくマイクロ秒単位)。 wallを介して警告するかどうか、およびどのモード(restart、kexecなどを参照)。

これが少なくともあなたを正しい方向に向けることを願っています!

11
bertieb