systemctl 如何安排系统关闭?

systemctl 如何安排系统关闭?

当我输入 时shutdown -h +30,Linux 会以某种方式在 30 分钟内安排运行级别的更改。在 Debian 上,/sbin/shutdown是 的符号链接/bin/systemctl。我的测试表明shutdown不是均不使用计划任务也不systemd 定时器

系统关机是如何实现的systemd

答案1

好问题。我尝试了现在我意识到你一定尝试过的方法——安排关机并查询 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 第 7387 行

因此看起来关闭是由logind。如果你愿意,你可以继续追寻细节——参见login-dbus.c。那里有用于调度、取消和管理关机的方法。但为了更深入地理解,您可能需要比我更多地了解 logind/systemd。

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

USEC=1435715559055789
WARN_WALL=1
MODE=poweroff

指示时间(大概以微秒为单位);是否通过 发出警告wall,以及采用哪种模式(参见重启、kexec 等)。

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

相关内容