systemctl 如何安排系统关闭?

pat*_*eza 12 linux shutdown runlevel systemd systemctl

当我输入 时shutdown -h +30,Linux 会在 30 分钟内以某种方式安排运行级别的更改。在 Debian 上,/sbin/shutdown是指向/bin/systemctl. 我的测试表明,shutdown使用既不的cron也不systemd定时器

系统关闭是如何实现的systemd

ber*_*ieb 11

好问题。我尝试了我现在意识到您一定尝试过的方法 - 安排关机并查询 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);
Run Code Online (Sandbox Code Playgroud)

systemctl.c 行 7387

所以看起来关机是由logind. 喜欢的可以继续追细节——看login-dbus.c。有一些方法可以安排、取消、管理停机。但是为了更深入的了解,您可能需要比我更了解 logind/systemd。

长话短说,关机信息(至少)存储在一个计划文件中/run/systemd/shutdown/scheduled,例如我的内容是:

USEC=1435715559055789
WARN_WALL=1
MODE=poweroff
Run Code Online (Sandbox Code Playgroud)

指示时间(大概以微秒为单位);是否通过 警告wall,以及哪种模式(cf restart、kexec 等)。

希望这至少为您指明了正确的方向!