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

在Windows上,您可以设置在服务失败时应该发生什么情况。 有没有一种标准的方式在Linux上实现同样的事情(特别是CentOS)?

我的问题的一个更大的部分是:你如何处理已经打开的套接字 – 例如在TIME_WAIT,FIN_WAIT1等状态。

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

谢谢你的帮助。

监控和重新启动服务时, monit是一种很好的方式,而且您可能最终将其用于其他基本服务(如Apache)。 nixCraft上有一篇很好的文章,详细介绍了如何使用这个服务,虽然monit本身还有更多的function。

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

你可以调用setsockopt(2)来用SO_REUSEADDR监听套接字,这样你就可以再次bind(2)而不用等待所有的连接过期。 另一种可能:从内核中删除连接。 FreeBSD有tcpdrop这个命令,不知道关于Linux。

如果您的Linux发行版使用Upstart而不是SysV init,那么respawn关键字会执行此操作。

http://upstart.ubuntu.com/cookbook/#respawn

只回答服务重启部分。 我也碰到过Monit,但在CentOS 7系统上,照顾好了所有这一切。 您只需要将这两行添加到.service文件(如果它们不在那里):

 Restart=always RestartSec=3 

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

如果你想创build一个自定义的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/