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

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

在 Windows 上,您可以设置当服务失败时应发生的情况。在 Linux(尤其是 CentOS)上是否有实现相同功能的标准方法?

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

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

感谢您的帮助。

答案1

monit是监控和重启服务(当服务失败时)的好方法——你最终可能会将其用于其他重要服务(例如 Apache)。有一个nixCraft 上的好文章详细说明如何将其用于服务,尽管monit其本身还有更多功能。

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

答案2

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

Restart=always
RestartSec=3

运行man systemd.service以供参考。

如果您想创建自定义 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

有很多选择Restart。以下是男人页:

重启=

配置当服务进程退出,被杀死或者超时时是否重新启动服务...

可采用 no、on-success、on-failure、on-abnormal、on-watchdog、on-abort 或 always 之一。如果设置为 no(默认值),则不会重新启动服务。如果设置为 on-success,则仅当服务进程干净退出时才会重新启动。在此上下文中,干净退出意味着以下任何一种情况:

• 退出代码为 0;

• 对于 Type=oneshot 以外的类型,为 SIGHUP、SIGINT、SIGTERM 或 SIGPIPE 之一;

• SuccessExitStatus= 中指定的退出状态和信号。

如果设置为 on-failure,当进程以非零退出代码退出、由信号终止(包括核心转储,但不包括前面提到的四个信号)、操作(例如服务重新加载)超时以及触发配置的看门狗超时时,服务将重新启动。

可以通过向应用程序发送适当的信号来测试重启。有关详细信息,请参阅手册man kill

答案3

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

答案4

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

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

相关内容