Ubuntu的systemd服务文件

核心实现思路

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