你有没有遇到过这种情况?服务器上的 Nginx 突然崩了,网站打不开,直到用户投诉才发现;或者 MySQL 进程意外退出,数据库连接全部失败。手动重启虽然简单,但要是半夜出问题,总不能一直盯着吧?其实 Linux 自带的 systemd 就能帮你实现"崩溃自动重启",今天就教你怎么给服务加个"自动复活甲"。

什么是 systemd?为什么用它?

systemd 是现在大多数 Linux 系统(比如 Ubuntu、CentOS、Debian)默认的服务管理器,相当于一个"管家",负责启动、停止、监控系统里的各种服务(比如 Nginx、MySQL)。

它最实用的功能之一就是自动重启崩溃的服务。只要简单配置一下,当服务意外停止时,systemd 会在几秒内自动重启它,用户几乎感觉不到中断。

准备工作:确认你的系统用 systemd

首先得确认系统是否支持 systemd,打开终端输入:

systemctl --version

如果输出了版本信息(比如 systemd 245),说明没问题,可以继续。

核心步骤:给服务加自动重启功能

以 Nginx 为例(其他服务比如 MySQL、Redis 步骤一样),只需 3 步:

第一步:找到服务的配置文件

每个 systemd 服务都有一个配置文件,告诉 systemd 如何管理它。

  1. 先查看服务的状态,找到配置文件路径:

    sudo systemctl status nginx
    

    输出里会有一行 Loaded: loaded (/lib/systemd/system/nginx.service; ...),其中 /lib/systemd/system/nginx.service 就是配置文件的路径。

  2. 如果没找到,可以用 find 命令搜索:

    sudo find / -name nginx.service 2>/dev/null
    

第二步:编辑配置文件,添加自动重启参数

nanovim 编辑这个配置文件(以找到的实际路径为准):

sudo nano /lib/systemd/system/nginx.service

找到 [Service] 这一段,添加下面两行:

[Service]
# 其他配置...
Restart=always          # 总是自动重启(不管什么原因停止)
RestartSec=5            # 停止后等待 5 秒再重启(避免频繁重启)

参数解释:

  • Restart=always:表示无论服务是正常退出、崩溃还是被杀死,都自动重启。 (可选值:on-failure 只在失败时重启,on-abort 只在异常终止时重启,新手建议用 always
  • RestartSec=5:重启前等待 5 秒,防止服务启动失败后无限循环重启(可以根据需要改成 10、15 等)。

第三步:让配置生效并测试

  1. 重新加载 systemd 配置,让修改生效:

    sudo systemctl daemon-reload
    
  2. 重启服务,应用新配置:

    sudo systemctl restart nginx
    
  3. 测试自动重启是否生效:

    • 先找到 Nginx 的进程 ID(PID):
      sudo systemctl status nginx
      
      输出里的 Main PID: 12345 (nginx) 中,12345 就是 PID。
    • 手动杀死这个进程,模拟崩溃:
      sudo kill -9 12345  # 注意替换成实际的 PID
      
    • 等待 5 秒(刚才设置的 RestartSec),再查状态:
      sudo systemctl status nginx
      
      如果显示 active (running) 且 PID 变了,说明自动重启成功!

其他服务怎么配置?照葫芦画瓢!

不管是 MySQL、Redis 还是你自己写的脚本,步骤都一样:

  1. 找到服务的 .service 配置文件(比如 mysql.serviceredis.service)。
  2. [Service] 段添加 Restart=alwaysRestartSec=5
  3. 重载配置并重启服务。

比如配置 MySQL 自动重启:

# 找到配置文件
sudo systemctl status mysql
# 编辑(路径以实际显示为准)
sudo nano /lib/systemd/system/mysql.service
# 添加参数后重载
sudo systemctl daemon-reload
sudo systemctl restart mysql

注意事项:别让自动重启帮倒忙

  1. 服务本身要稳定:如果服务因为代码 bug 频繁崩溃,自动重启只能临时解决问题,还是要根治 bug。
  2. 避免无限循环:如果服务启动后立即崩溃,RestartSec=5 会让它每 5 秒重启一次,可能消耗大量资源。这种情况要先排查启动失败的原因(比如配置错误、权限问题)。
  3. 日志很重要:自动重启后,用 journalctl -u 服务名 查看日志,找到崩溃原因:
    journalctl -u nginx  # 查看 Nginx 的运行日志
    

总结:一句话记住这个技巧

systemd 服务的配置文件加两行:

Restart=always
RestartSec=5

就能让服务崩溃后自动复活。