如何在 Linux 中出现故障时自动重启服务

Pry*_*ryo 33 linux service socket

在 Windows 上,您可以设置如果/当服务失败时应该发生的情况。在 Linux(特别是 CentOS)上有没有标准的方法来实现同样的事情?

我的问题的一个重要部分是:如何处理保持打开状态的套接字 - 例如在 TIME_WAIT、FIN_WAIT1 等状态中。

目前,如果我正在开发的服务崩溃,我必须等待套接字清除或更改侦听端口,然后才能手动重新启动它。

谢谢你的帮助。

Nag*_*gev 32

只回答服务重启部分。我也遇到过 Monit,但在 CentOS 7 上 systemd 会为你处理所有这些。您只需要将这两行添加到 .service 文件中(如果它们还没有):

Restart=always
RestartSec=3
Run Code Online (Sandbox Code Playgroud)

请参阅https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/以供参考。

如果你想创建一个自定义的 systemd 服务,编写你自己的服务文件非常简单。有关自定义 http 服务器,请参见下面的示例。

使用新的服务文件启动编辑器:

vim /etc/systemd/system/httpd.service
Run Code Online (Sandbox Code Playgroud)

并添加以下内容,您可以根据需要进行编辑:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我希望它在启动时自动启动:

systemctl enable httpd
Run Code Online (Sandbox Code Playgroud)

告诉 systemd 更改并启动服务:

systemctl daemon-reload
systemctl start httpd
Run Code Online (Sandbox Code Playgroud)

现在你可以看到状态:

systemctl status httpd
Run Code Online (Sandbox Code Playgroud)


And*_* M. 27

monit是在服务失败时监视和重新启动服务的好方法——您可能最终会将其用于其他基本服务(例如 Apache)。在 nixCraft 上有一篇很好的文章详细说明了如何将它专门用于服务,尽管monit它本身还有更多功能。

至于插座方面,@galraen 回答了这个问题。


gel*_*aen 13

您可以使用 调用setsockopt(2)侦听套接字SO_REUSEADDR,这样您就可以bind(2)再次使用它,而无需等待所有连接到期。另一种可能性:从内核断开连接。FreeBSD 有tcpdrop这方面的命令,不知道 Linux。