通过参考frp的官方文档可以顺利的实现frps的systemd方式控制,但是当我将其套用到frpc,发现无法正常开机自启。但是可以通过手动方式启动(systemctl start frpc)。这就奇了怪了!
仔细检查一下官方文档给出的例子
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.ini
[Install]
WantedBy = multi-user.target
发现这个unit里面的After = network.target 貌似有点问题,这个target只能indicates that the network management stack has been started,不能保证网络连接已经建立,对于server型程序,网络管理栈启动后就能运行了。但是,对于client型程序,我们要等到网络连接完全ok才能运行,所以这里我们要将After = network.target 修改为After = network-online.target
在systemd的官方文档中对于 network-online.target 的解释是: is a target that actively waits until the network is “up”, where the definition of “up” is defined by the network management software. Usually it indicates a configured, routable IP address of some kind. Its primary purpose is to actively delay activation of services until the network has been set up. 最后还贴心的给出了这个target的主要用处是配置那些必须要网络连接才能运行的客户端程序。
于是,我最终将frpc.service修改为如下内容:
[Unit]
# 服务名称,可自定义
Description = frp client
# After = network.target syslog.target
# Wants = network.target
After=network-online.target
Wants=network-online.target
[Service]
Type = simple
# 启动frpc的命令,需修改为您的frpc的安装路径
ExecStart = /xxx/xxx/frpc -c /xxx/xxx/frpc.ini
[Install]
WantedBy = multi-user.target
最后设置开机自启即可
systemctl enable frpc
参考
- https://systemd.io/NETWORK_ONLINE/
- https://www.freedesktop.org/software/systemd/man/systemd.special.html#