systemd服务如何判断自身是开机自启还是通过systemctl restart命令启动
两种可行方案实现systemd服务启动场景区分
方案1:通过环境变量显式标记(最稳定,兼容性最好)
这是更推荐的实现方式,完全可以通过服务配置+手动传参的方式实现区分:
- 首先在你的
daemon.service的[Service]段添加默认环境变量,标记开机自启场景:
系统开机自启时,服务会继承这个默认的[Service] Environment="START_TYPE=boot" # 原有配置如ExecStart、User等保持不变 [Install] WantedBy=multi-user.targetSTART_TYPE=boot变量。 - 手动执行重启操作时,给systemctl传临时环境变量覆盖默认值即可:
如果你使用的systemd版本 ≥236,直接用内置的--set-env参数:
守护进程内部直接读取systemctl restart daemon.service --set-env=START_TYPE=manualSTART_TYPE环境变量即可判断当前启动场景,值为boot就是开机自启,值为manual就是手动重启。 - 如果你使用的systemd版本较低不支持
--set-env,可以提前给手动场景写一个drop-in配置文件,或者直接创建一个别名命令封装手动重启的逻辑,避免每次输入长命令。
方案2:在守护进程内部直接检测(无需修改启动命令,依赖systemd接口)
如果不想修改手动重启的操作习惯,可以直接在代码里通过systemd接口查询当前服务的触发源:
- 执行查询命令:
systemctl show daemon.service --property=InvokedBy- 如果返回值包含你服务
[Install]段配置的WantedBy目标(比如multi-user.target、graphical.target),说明是开机自启触发 - 如果返回值为空或者包含临时事务ID,说明是用户手动执行start/restart触发
- 如果返回值包含你服务
- 注意这个方案的兼容性随systemd版本有小幅差异,测试时需要覆盖你部署的所有系统版本。
内容的提问来源于stack exchange,提问作者Poldi
相关产品推荐
相关产品推荐

