需配置Restart=always、RestartSec=3和StartLimitIntervalSec=0三项参数,并执行daemon-reload与restart生效;用户级服务须用systemctl --user配合enable-linger,禁放系统目录。

通过systemd配置服务崩溃自动重启
银河麒麟OS基于Linux内核与systemd服务管理器,当关键后台服务(如nginx、mysql、自定义守护进程)意外退出时,需通过systemd的Restart=策略实现崩溃后秒级拉起,避免人工干预导致业务中断。
第一步:确认目标服务当前状态,执行sudo systemctl status 服务名(例如nginx),观察Active行是否为active (running)或failed;若显示inactive,先运行sudo systemctl start 服务名确保它能正常启动一次。
第二步:编辑该服务的单元文件,执行sudo systemctl edit 服务名(例如sudo systemctl edit nginx),这会创建覆盖式配置片段,避免直接修改原始文件导致升级被覆盖。
第三步:在打开的编辑器中输入以下内容:
[Service]
Restart=always
RestartSec=3
StartLimitIntervalSec=0
其中Restart=always表示无论退出码为何都重启;RestartSec=3设定失败后等待3秒再拉起,防止高频崩溃打满CPU;【StartLimitIntervalSec=0是关键,它禁用systemd默认的10秒内最多启动5次的限制,否则连续崩溃将被永久禁启】。
第四步:保存退出后,执行sudo systemctl daemon-reload强制重载所有unit配置,再运行sudo systemctl restart 服务名使新策略立即生效。
验证崩溃自动恢复机制是否生效
手动触发一次服务异常退出,检验systemd是否按预期响应。这一步必须实操验证,不能仅依赖配置存在就认为成功。
执行sudo kill -9 $(pgrep -f "服务名")强制终止主进程(例如sudo kill -9 $(pgrep -f "nginx: master"))。
等待3秒后,立刻运行sudo systemctl status 服务名,检查Active行是否已变回active (running),且Main PID数值更新——若PID未变或仍显示failed,说明RestartSec或StartLimitIntervalSec配置有误。
若服务启动后又迅速退出,用journalctl -u 服务名 -n 50 -f实时跟踪日志,重点查找“exited with code”或“failed to bind”类错误,这类问题无法靠自动重启解决,必须修复根本原因。
为用户级服务启用崩溃自启(非root服务)
某些应用以普通用户身份运行(如Ollama、Nextcloud CLI同步器),其崩溃恢复不能依赖系统级service,必须使用systemd --user实例。
方法一:启用用户级systemd实例
执行loginctl enable-linger $USER,这确保用户登出后其systemd --user仍持续运行,是用户服务常驻的前提。
方法二:创建用户级service文件
运行mkdir -p ~/.config/systemd/user && nano ~/.config/systemd/user/myapp.service,填入标准单元定义,务必包含Restart=on-failure与User=$USER字段。
方法三:启用并启动
执行systemctl --user daemon-reload && systemctl --user enable --now myapp.service。注意此处不加sudo,命令前缀为systemctl --user而非sudo systemctl。
【切勿将用户级service文件放在/etc/systemd/system/下,否则systemd会拒绝加载并报错Unit myapp.service does not belong to user】。

















