Type=oneshot
显示触发系统断电的systemd服务。例如,这可以用于,以避免出现sigpwr.target
问题sigpwr.target
从工作模式开始replace-irreversible
。
确保 oneshot 服务在完成之前不会被终止,因为这会导致显示失败。
- 是否存在可能的顺序,让 systemd 在完成之前停止或终止您的服务?如果有的话,会产生什么影响?
- 如果可以的话,你们的服务也能正常工作吗?是从工作模式开始
replace-irreversible
?
答案1
# trigger-poweroff.service
[Unit]
DefaultDependencies=no
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --no-block poweroff
DefaultDependencies=no
避免隐式Conflicts=shutdown.target
.这意味着服务是否以作业模式启动并不重要replace-irreversible
。它还避免了隐式的Wants=sysinit.target
;例如,如果您想在转换到emergency.target
.
Before=shutdown.target
确保服务在 systemd-shutdown 开始发送信号之前完成。如果不出意外的话,这使得该单元的正确性分析变得更简单。我们通过确保服务不会等待断电完成来避免死锁。
systemd-shutdown
如果用 SIGTERM 杀死 systemctl 进程也没关系。该过程将简单地以 statusWIFSIGNAL
和 a WTERMSIG
of终止SIGTERM
。 Systemd 将此视为干净、成功的退出。请参阅 中 SuccessExitStatus 的定义man systemd.exec
。但是,如果内核神秘地没有在 systemd 之前安排此初始退出DEFAULT_TIMEOUT_USEC
,则 systemd-shutdown 将发送不可阻止的信号 SIGKILL。 Systemd 不会将此视为成功退出。