如何在Linux中自动重启失败的服务

在一个Linux系统中,服务(也称为守护进程)在处理诸如Web托管、数据库管理和网络等各种任务中扮演着关键角色。然而,服务有时可能会由于错误、资源使用过高或意外系统故障而崩溃或停止。

为了防止停机时间并确保平稳运行,系统管理员可以配置服务在失败时自动重新启动,这对于需要始终可用的Web服务器(Apache、Nginx)、数据库(MySQL、PostgreSQL)或其他关键应用特别有用。

在本指南中,我们将解释如何使用systemd在Linux中配置服务,以便在停止时自动重新启动。

为什么要自动重启服务?

有几个原因可能导致你想要在Linux中自动重新启动服务:

  • 最小化停机时间:如果服务意外停止,自动重新启动确保用户经历最小中断。
  • 提高可靠性:像Web服务器、数据库和后台进程这样的服务应始终运行。
  • 减少手动工作:没有自动化,你需要频繁检查服务,并在它们失败时手动重新启动。
  • 处理意外故障: 如果服务由于软件错误、资源限制或系统错误而崩溃,systemd 可以在无需管理员干预的情况下重新启动它。

现在,让我们按照以下步骤设置自动重启使用 systemd

步骤 1: 确定要重新启动的服务

在进行更改之前,您需要知道要配置的服务的确切名称,方法是通过 列出所有正在运行的服务

systemctl list-units --type=service --state=running
List Running Linux Services

如果您已经知道服务名称,可以检查其状态。

systemctl status apache2
Check Running Service Status

apache2 替换为您想管理的实际服务名称。

步骤 2: 编辑服务配置

Systemd 允许您使用自定义配置文件修改服务行为。我们将使用 systemctl edit 创建一个覆盖文件,而不是修改系统范围的设置(这些设置可能会在更新期间被覆盖)。

运行以下命令:

systemctl edit apache2

这将在您的 默认文本编辑器 中打开一个空白文件。

如果文件不为空,您将看到可以修改的现有设置。否则,您需要添加必要的重启配置。

Open Systemd Service Configuration File

步骤 3: 添加 Systemd 重启配置

在编辑器中添加以下行。

[Service]
Restart=always
RestartSec=5s

这些设置的说明:

  • Restart=always – 确保服务在停止时无论原因如何都能重启。
  • RestartSec=5s – 告诉systemd在重启服务之前等待5秒,这可以防止在反复失败的情况下快速重启循环。

添加后,保存并关闭文件。

Add Service Restart Configuration

在对systemd服务进行更改后,您需要重新加载systemd并重启服务,以确保新配置生效:

sudo systemctl daemon-reload
sudo systemctl restart apache2

要确认服务现在已设置为自动重启,请运行:

sudo systemctl show apache2 | grep Restart

如果一切配置正确,您应该会看到:

Restart=always

步骤4:在Linux中测试自动重启

为了确保配置有效,您可以手动停止服务并检查它是否重启。

sudo systemctl stop apache2

等待5秒,然后检查其状态。

sudo systemctl status apache2

如果服务再次运行,则自动重启功能正常!

其他重启选项

根据您的需求,systemd提供不同的重启策略:

  • Restart=always – 服务始终重启,即使它是手动停止的。
  • Restart=on-failure – 仅在服务因错误退出时重启(但不在手动停止时)。
  • Restart=on-abnormal – 如果服务因信号(如段错误)崩溃,则重启服务。
  • Restart=on-watchdog – 如果服务在运行时超时,则重启服务。

您可以根据需求将Restart=always替换为以下任何选项之一。

如何检查服务问题日志

如果某个服务一直失败,建议使用journalctl命令来查看服务的日志,该命令将显示该服务在过去10分钟内的日志。

journalctl -u apache2 --since "10 minutes ago"

要查看实时日志流,请使用:

journalctl -u apache2 -f
结论

为失败的服务设置自动重启可确保关键应用程序持续运行,无需手动干预。通过使用systemd的重启选项,您可以将停机时间最小化,提高系统稳定性,并减少手动故障排除的需求。

Source:
https://www.tecmint.com/automatically-restart-service-linux/