Хороший вопрос. Я попробовал то, что теперь понял, что вы, должно быть, пытались запланировать завершение работы и запросить системные таймеры!
Это показало, что выключение не было в системных таймерах, как вы заметили. Итак, быстрое изучение источника 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
и в каком режиме (cf restart, kexec и т. д.).
Надеюсь, что это указывает вам в правильном направлении, по крайней мере!