能否为系统中所有systemd服务批量添加Restart=on-failure配置(优先采用覆盖方式)
能否为系统中所有systemd服务批量添加Restart=on-failure配置(优先采用覆盖方式)
当然可以!针对你提到的「服务因硬件问题开机启动失败,想批量设置Restart=on-failure而不是逐个配置」的场景,有两种靠谱的方案,优先覆盖方式的话推荐第一种:
方案一:批量生成服务的Drop-in覆盖配置(推荐,真正的覆盖方式)
systemd的Drop-in配置是专门用来覆盖或补充原有服务配置的机制,每个服务的Drop-in文件会优先于原服务文件生效。我们可以写个简单的脚本批量给所有服务生成对应的Drop-in配置:
- 执行以下脚本(可根据需求调整服务范围,比如只处理已启用的服务):
# 获取所有已启用的systemd服务(若要处理所有服务,把--state=enabled改成--state=all即可) for service in $(systemctl list-unit-files --type=service --state=enabled | awk '{print $1}' | grep -v "^UNIT FILE$"); do # 跳过系统核心关键服务(避免意外,可根据实际情况修改排除列表) if [[ $service != "systemd.service" && $service != "systemd-journald.service" && $service != "systemd-udevd.service" ]]; then # 创建该服务的Drop-in配置目录(不存在则创建) mkdir -p "/etc/systemd/system/${service}.d" # 写入Restart配置的Drop-in文件 cat > "/etc/systemd/system/${service}.d/restart-on-failure.conf" << EOF [Service] Restart=on-failure EOF fi done # 重新加载systemd配置,让新的Drop-in生效 systemctl daemon-reload
- 生效说明:
- 这个方法会强制覆盖每个服务的
Restart参数,哪怕原服务本身已经设置了其他Restart值,Drop-in里的配置会优先生效 - 对于已经在运行的服务,需要重启它们才能让新的重启策略生效:
systemctl restart <服务名>,如果要批量重启,可在脚本末尾添加循环重启的命令(注意:不要随意重启系统核心服务,避免系统异常)
- 这个方法会强制覆盖每个服务的
方案二:修改systemd全局默认配置(fallback方式)
如果想设置全局默认的重启策略(仅当服务本身没有配置Restart时生效),可以修改systemd的全局配置文件:
- 编辑
/etc/systemd/system.conf文件,找到[Manager]区块,添加或修改以下内容:
DefaultRestart=on-failure
- 执行以下命令让配置生效:
systemctl daemon-reexec
- 注意事项:
- 这个是默认fallback机制,不会覆盖服务本身已经配置的
Restart参数,只有服务没设置时才会用这个默认值 - 若之后想恢复默认,只需把
DefaultRestart注释掉或者改回原默认值(通常是no),再执行systemctl daemon-reexec即可
- 这个是默认fallback机制,不会覆盖服务本身已经配置的
取消配置的方法
如果之后想撤销批量设置的Restart=on-failure,只需删除对应的Drop-in文件即可:
for service in $(systemctl list-unit-files --type=service --state=enabled | awk '{print $1}' | grep -v "^UNIT FILE$"); do rm -f "/etc/systemd/system/${service}.d/restart-on-failure.conf" # 如果Drop-in目录为空,可顺便删除目录 rmdir --ignore-fail-on-non-empty "/etc/systemd/system/${service}.d" done systemctl daemon-reload
备注:内容来源于stack exchange,提问作者xeruf
相关产品推荐
相关产品推荐

