获取 systemd 的实际状态

Dom*_*Dom 1 debian boot systemd

我们如何知道 systemd 是否已完成引导系统?

如果由于缺少网络连接,系统实际上处于启动过程中,我不想在 cron 作业上执行。我的由 cron 启动的脚本会在上面进行测试,如果启动过程没有完成,它会退出

#!/bin/sh
$STATE=`HERE ADD THE MISSING PART`
if [ $STATE != "active" ]; then
  exit
fi
# Actions to do on next cron after booting
Run Code Online (Sandbox Code Playgroud)

如果它也可以向我提供有关关闭过程的信息,因为问题可能是相同的..;

我使用运行级别命令使用 SystemV 执行此操作,但 Systemd 在启动结束时不会更改运行级别。

谢谢

Lac*_*cek 5

您可以检查您需要激活的目标,以便您的脚本运行。例如,为了使网络可访问,您需要检查network-online.target(systemctl check如果检查的单元处于活动状态,则返回 0)

systemd 尝试达到的目标是它的“默认”目标,可以通过systemctl get-default. 如果该目标在线,则系统已完成引导(因此您可以发出systemctl status $(systemctl get-default)检查引导过程是否已完成)

编辑: 如果您只想监控系统的当前状态,并且您对目标不感兴趣(即您只想在一切正常运行时运行您的命令),最好使用该systemctl is-system-running命令。它将输出running是否一切正常,或者degraded如果系统已启动但某些服务已失败(这可能表示错误,也可能不表示)。其他状态将表明您的脚本不应运行。作为旁注,通常最好检查返回值而不是解析文本输出,但联机帮助页没有指定返回值,只说明非零退出代码的“运行”结果以外的任何内容,因此它可能更安全解析输出文本。

有关systemctl可能的输出值,请参阅联机帮助页。