在运行一个服务时,会遇到程序因为内部出错,运行中止的情况。如果使用人工发现并且重启的方法,会很严重地影响服务的可用性,也增大了人工操作成本。
处理这个问题有多重方法,最简单的方法是使用 supervisor 这样的软件来运行服务,可以参考:http://supervisord.org。
在 Unix/Linux 类的操作系统中,一般使用专门的服务管理软件调度服务进程,比较主流的有:System V 的 Init 系统、Upstart 和最新的 systemd。这些服务管理软件都有检测服务状态,当服务异常退出重启的功能。可以参考:https://www.digitalocean.com/community/tutorials/how-to-configure-a-linux-service-to-start-automatically-after-a-crash-or-reboot-part-1-practical-examples
由于我自己使用 Ubuntu,而 Ubuntu 最新的几个版本的服务管理软件为 systemd,所以我简单介绍一下 systemd 的异常退出重启配置方法。
systemd 的基本概念和使用方法可以参考:https://wiki.archlinux.org/index.php/Systemd,也有对应的简体中文版:https://wiki.archlinux.org/index.php/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)。
systemd 的操作很简单,基本为:
systemctl start|stop|reload|restart|status 服务单元名
用来开始、结束、重新载入、重启、查看服务。
systemctl enable|disable|is-enabled 服务单元名
用来设置和查看服务的开机启动状态。
systemd 的配置文件简单来说如下:
[Unit]
#简单介绍当前服务单元
Description=Shadowsocks multiple user server
#需要哪些服务单元启动后启动当前服务单元
Requires=network.target
[Service]
#服务的类型,一般都是 simple,具体可以看上面的参考网页
Type=simple
#告诉 systemd 如何启动服务。启动的服务应当为持续运行的服务,不要加后台运行的选项
ExecStart=/usr/local/bin/ssserver -c /etc/shadowsocks/servers.json --pid-file=/tmp/ssserver.pid
#这是本文解决异常退出自动重启的方法,只要简单加一行
Restart=always
[Install]
WantedBy=multi-user.target
从上面的描述就知道了,服务异常退出重启,只需要在 systemd 的服务描述中添加 Restart=always
一行即可达到目的。