核心实现思路
systemd 通过After=(启动顺序)和Requires=/Wants=(依赖关系)来控制服务间的启动逻辑:
After=:指定 Gitea 服务必须在 MySQL 隧道服务之后启动;
Requires=(强依赖):如果 MySQL 隧道服务启动失败,Gitea 服务也会启动失败;
或 Wants=(弱依赖):MySQL 隧道服务启动失败,Gitea 仍尝试启动(推荐用Requires=,因为 Gitea 依赖 MySQL);
需先确认你的 MySQL 隧道服务的实际服务名(比如你之前命名的mysql-tunnel.service)。
文件格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| # [Unit] 段:服务元信息与依赖 [Unit] # 服务的描述信息,方便识别这个服务的用途(远程 MySQL 的自动 SSH 隧道) Description=Auto SSH Tunnel for Remote MySQL # 定义服务启动时机:必须等network.target(网络基础服务)和network-online.target(网络完全可用)启动完成后,才启动本服务 After=network.target network-online.target # 弱依赖:启动本服务时会尝试启动network-online.target,但即使后者启动失败,本服务仍会尝试启动(保证网络就绪后再连隧道) Wants=network-online.target # 限制1分钟内最多重启5次,避免无意义循环 StartLimitIntervalSec=60 StartLimitBurst=5
# [Service] 段:服务核心运行规则 [Service] # 替换为你的本地用户名(如ubuntu、root) # 指定服务以哪个用户 / 用户组运行(避免用 root,提升安全性) #用户= User=<你的本地用户名> #组= Group=<你的本地用户名> # 服务类型:表示ExecStart指定的命令是服务的主进程,systemd 会直接启动该进程并视为服务启动完成(最常用的类型) Type=simple # 核心命令(替换远端服务器IP) # 服务启动时执行的核心命令 ExecStart= # 异常自动重启 # 重启规则:无论服务以何种原因退出(正常 / 异常),都会自动重启(核心的自动重连配置) Restart=always # 重启间隔:服务退出后,等待 10 秒再尝试重启 RestartSec=10
# 禁止多实例 # 例外规则:如果服务退出码是 255(SSH 连接认证失败 / 主动关闭等),则不自动重启(避免无效循环) RestartPreventExitStatus=255
# [Install] 段:服务安装配置 [Install] # 服务的安装目标:表示当系统进入 “多用户模式”(正常运行级别)时,该服务会被启用(执行systemctl enable后生效,开机自启) WantedBy=multi-user.target
|
关键配置解释
| 新增配置 |
作用 |
After=mysql-tunnel.service |
强制 Gitea 服务在mysql-tunnel.service启动完成后才启动(仅控制顺序,不检查服务是否成功);⚠️ 注意:需将mysql-tunnel.service替换为你实际的 MySQL 隧道服务名(比如你可能命名为auto-ssh-mysql.service)。 |
Requires=mysql-tunnel.service |
强依赖关系:1. 启动 Gitea 时,systemd 会先尝试启动mysql-tunnel.service;2. 如果mysql-tunnel.service启动失败(如 SSH 隧道连不上),Gitea 服务也会启动失败;3. 如果运行中mysql-tunnel.service意外停止,Gitea 服务也会被停止(保证依赖完整性)。 |
测试文件参数是否正确
1
| systemd-analyze verify /etc/systemd/system/mysql_tunnel.service
|