如何在Linux中发生故障时自动重新启动服务


23

在Windows上,您可以设置服务失败的情况。是否有在Linux(特别是CentOS)上实现相同功能的标准方法?

我的问题的更大一部分是:如何处理未打开的套接字-例如在TIME_WAIT,FIN_WAIT1等状态下。

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

谢谢你的帮助。

Answers:


26

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

至于套接字方面,@ galraen回答了这个问题。


这是一个耻辱,我必须决定哪些是的答案。我应该问两个单独的问题。@gelraen您的回答刚刚结束了我寻找解决方案的那几周。谢谢你这么多!@Redmumba谢谢,Monit看起来不错!
Pryo

哪一个你决定来标记正确,绝对给予好评 @ gelraen的答案。它的位置正确,而且非常有用。
安德鲁M.

19

仅回答服务重启部分。我也遇到过Monit,但是在CentOS 7上,systemd会为您完成所有这些工作。您只需要将这两行添加到.service文件中(如果它们尚不存在):

Restart=always
RestartSec=3

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

如果要创建自定义systemd服务,则编写自己的服务文件非常简单。有关自定义http服务器的信息,请参见以下示例。

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

vim /etc/systemd/system/httpd.service

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

[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

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

systemctl enable httpd

告诉systemd有关更改并启动服务:

systemctl daemon-reload
systemctl start httpd

现在您可以看到状态:

systemctl status httpd

有关参考,请参阅https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/


是的,确切地说,大多数流行发行版中systemd的标准服务经理都可以为您做到这一点。
罗尔夫

13

您可以使用调用setsockopt(2)监听套接字SO_REUSEADDR,这样您就可以bind(2)再次调用它,而不必等待所有连接过期。另一种可能性:从内核中删除连接。FreeBSD tcpdrop对此有命令,对Linux不了解。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.