在 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
关键字就会执行此操作。