systemd 服务如何检测系统将要关闭?

systemd 服务如何检测系统将要关闭?

我有一个系统服务控制一些硬件,让我们以灯为例。重新启动服务或重新启动电脑就可以了,因为灯打开一段时间是安全的。

但是,如果(且仅当)系统要停止(关闭电源)时,我不仅要进行常规清理,还要关闭灯,即以稍微不同的方式停止服务。

在所有提到的情况下(服务重新启动、重新启动、停止),ExecStop 命令的执行方式相同。我如何区分这些情况或知道 systemd 是否正在关闭电源?

答案1

事实证明,您可以通过检查输出来确定系统的状态

systemctl is-system-running      # See man 1 systemctl for more info

对于您的情况,我建议用以下方法包裹负责关闭灯的部分:

if [[ "$(systemctl is-system-running || true)" == "stopping" ]]; then
    # RUN THE COMMANDS OR EXECUTABLES FOR TURNING OFF THE LAMP HERE
fi

当然,如果您不想维护单独的包装器(即ExecStop=sh -c 'if ... fi),您始终可以直接在 ExecStop 中内联检查。

答案2

回答解释如何使用功率目标

您可以添加一项服务,该服务将在关闭电源事件时触发命令,例如

[Unit]
Description=My command on power event
Before=shutdown.target
DefaultDependencies=no

[Service]
ExecStart=/some/thing/to/execute
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=shutdown.target

相关内容