debian11下添加 systemd 服务守护,替代supervisor来守护

1、创建一个名为 /etc/systemd/system/svnserve.service 的systemd 服务文件文件,内容如下:

[Unit]
Description=Subversion Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/svnserve -d -r /www/svndata
ExecStop=/usr/bin/pkill svnserve
Restart=on-failure
User=svnuser
Group=svnuser

[Install]
WantedBy=multi-user.target

说明:

Type=forking:因为 svnserve -d 会自行守护。

ExecStart:启动 svnserve 的命令。

ExecStop:停止 svnserve 的命令。

Restart=on-failure:在进程异常退出时自动重启。

User/Group:建议使用专用用户(如 svnuser)运行,以提高安全性。

2、重新加载 systemd 配置并启动服务

sudo systemctl daemon-reload

sudo systemctl enable svnserve

sudo systemctl start svnserve

3、验证服务状态

sudo systemctl status svnserve

4、为啥不用supervisor来守护,原因分析如下:

(1)svnserve 的运行模式

-d 参数(守护进程模式):
svnserve 作为守护进程在后台运行,持续监听默认端口(3690),等待客户端连接。适合需要持续监听和接受外部连接的场景,如通过 Tortoise 访问。

-i 参数(inetd 模式):
svnserve 不持续监听端口,而是通过 inetd 或类似的超级服务器接收连接。每次有连接时,inetd 会启动一个新的 svnserve 实例处理该连接。不适合直接由 Supervisor 管理,因为需要外部进程(如 inetd)来传递连接。

-t 参数(隧道模式):
svnserve 通过 SSH 隧道等方式接收连接,也不会持续监听端口。适用于通过 SSH 进行 SVN 访问的场景。

(2)Supervisor 的工作方式
Supervisor 设计用于管理持续在前台运行的进程。它监控进程的状态,如果进程意外退出,会自动重启。如果被管理的进程在启动后自行守护(如使用 -d 参数),Supervisor 会认为进程已经退出,从而尝试重新启动。这会导致进程不断重启,无法稳定运行。

(3)使用 -i 或 -t 参数启动 svnserve 时,svnserve 本身不监听端口,依赖外部进程(如 inetd)传递连接。如果没有正确配置 inetd,svnserve 实际上并没有在监听端口,导致通过 Tortoise 客户端访问失败访问失败。