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)
所以看起来关机是由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 等)。
希望这至少为您指明了正确的方向!