时间:2025年6月1日晚

主机:中柏

系统:ubuntu23.10

遇到bug:开机后服务并未启动

bug是否消失:是

bug是否彻底解决:是

bug严重等级:红色


2025-06-01 22:26

在服务器上配置穿透隧道并手动启动:

运行正常,但我发现关闭终端会中断隧道连接,肥肠麻烦,于是决定使用systemd配置开机自启


2025-06-01 22:30

首先创建systemd服务文件 /etc/systemd/system/mefrpc.service :

sudo nano /etc/systemd/system/mefrp.service

文件内容为:

(注意:mefrpc -t字段不要重复,工作路径"WorkingDirectory"、执行文件路径"ExecStart"和用户名"User"换成你自己的。总之就是改中文字段/还有去掉双引号)

[Unit]
Description=mefrpc client
After=network.target

[Service]
Type=simple
ExecStart=/home/你的用户名/mefrpc -t "你的启动参数"
WorkingDirectory=/home/你的用户名/
Restart=on-failure
User=你的用户名

[Install]
WantedBy=multi-user.target

按Ctrl+o保存,回车,Ctrl+x退出

然后使用命令完成服务注册并启动:

sudo systemctl daemon-reload
sudo systemctl enable mefrp.service
sudo systemctl start mefrp.service

使用命令验证服务是否运行:

systemctl status mefrp.service

***

如果出现类似信息:

[root@your-server ~]# sudo systemctl daemon-reload
[root@your-server ~]# sudo systemctl enable mefrp.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mefrp.service to /etc/systemd/system/mefrp.service.
[root@your-server ~]# sudo systemctl start mefrp.service
[root@your-server ~]# sudo systemctl status mefrp.service -l
● mefrp.service - mefrpc client
Loaded: loaded (/etc/systemd/system/mefrp.service; enabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since 日 2025-09-21 00:53:51 +08; 15ms ago
Process: 27497 ExecStart=/home/USERNAME/mefrpc -t YOUR_TOKEN -p PORT (code=exited, status=203/EXEC)
Main PID: 27497 (code=exited, status=203/EXEC)

9月 21 00:53:51 your-server systemd[1]: mefrp.service: main process exited, code=exited, status=203/EXEC
9月 21 00:53:51 your-server systemd[1]: Unit mefrp.service entered failed state.
9月 21 00:53:51 your-server systemd[1]: mefrp.service failed.

记得给mefrpc赋权:

chmod +x /home/你的用户名/mefrpc

2025-06-01 22:43

我又创建了一个穿透隧道,决定命名为 mefrpbox:

和之前一样,先创建systemd服务文件 /etc/systemd/system/mefrpbox.service :

sudo nano /etc/systemd/system/mefrpbox.service

启动参数改成你在网站生成的启动配置:

(注意:mefrpc -t字段不要重复,工作路径"WorkingDirectory"、执行文件路径"ExecStart"和用户名"User"换成你自己的。总之就是改中文字段)

[Unit]
Description=mefrpc client
After=network.target

[Service]
Type=simple
ExecStart=/home/你的用户名/mefrpc -t "你的启动参数"
WorkingDirectory=/home/你的用户名/
Restart=on-failure
User=你的用户名

[Install]
WantedBy=multi-user.target

按Ctrl+o保存,回车,Ctrl+x退出

注册并启用:

sudo systemctl daemon-reload
sudo systemctl enable mefrpbox.service
sudo systemctl start mefrpbox.service

两项服务均运行正常:


2025-06-01 23:00

重启电脑,测试服务开机自启是否生效。

结果发现两个服务都没有运行,排查发现mefrpc和mefrpbox都没有成功连上穿透服务器,但手动启动后仍可正常运行,检查文件无误后,我判断是系统启动时网络尚未就绪,客户端提前执行,导致连接失败


2025-06-01 23:10

修改两个systemd服务文件,在[Unit]段添加:

Wants=network-online.target
After=network-online.target

修改后分别重启服务:

sudo systemctl daemon-reload
sudo systemctl restart mefrpc.service
sudo systemctl restart mefrpbox.service

2025-06-01 23:20

再次重启系统后验证,两个服务均在网络就绪后自动启动,systemctl status显示为active(running),并成功建立MEFrp隧道

问题完美解决。

总结

问题根源在于systemd启动服务时网络尚未完全连接,mefrpc无法建立隧道,导致服务中断。通过在服务配置中添加network-online.target的依赖,确保网络连接后再启动服务,问题完美解决


2025-06-01 23:33

处于长期维护的考虑,我决定将最初的mefrp.service更改为mefrp-"容器名称",后续再创建服务也更加方便管理。

您也可以参照我的办法管理,记得把替换为你的自用命名

首先停止旧服务:

sudo systemctl stop mefrpc.service

重命名service文件:

sudo mv /etc/systemd/system/mefrpc.service /etc/systemd/system/mefrp-"容器名称".service

启动你新命名的服务:

sudo systemctl enable mefrp-"容器名称".service
sudo systemctl start mefrp-"容器名称".service

确认服务状态是否正常:

systemctl status mefrp-"容器名称".service

附加项:重启服务器验证

这样一来,以后就能通过 mefrp-"容器名称" 来区分用途,不容易混淆了