0
点赞
收藏
分享

微信扫一扫

使用 systemd 管理 frp 服务

诗尚凝寒 2022-01-25 阅读 91

frp 是一个高性能的内网穿透工具,本文将讲解如何使用 systemd 进行管理 frp 服务,保持 frp 持续正常地工作。

systemd 是一个专用于 Linux 操作系统的系统与服务管理器,PID=1,启动并维护各种用户空间的服务。

systemd 服务单元

systemd 拥有 11 个单元类型,分别是:服务(service)、套接字(socket)、设备(device)、挂载点(mount)、自动挂载点(automount)、 启动目标(target)、交换分区或交换文件(swap)、被监视的路径(path)、任务计划(timer)、 资源控制组(slice)、一组外部创建的进程(scope)。
其中,服务单元是以 .service 为后缀的单元文件,封装了一个被 systemd 监视与控制的进程。服务的单元文件包括三个部分:[Service][Unit][Install]

在 GItHub 上下载的 frp 压缩包中,systemd 目录下包含单元文件单元模板文件这两个文件用哪个配置都是可以的。可以基于这两个文件进行 frps 和 frpc 服务的管理,这里只以 frps 举例,frpc 操作完全一样。

基于单元文件管理 frps 服务

我们先使用 frps 的单元文件 frps.service 进行管理 frps 服务。先看一下 frps.service 的文件内容 (注释是后期补上去的,源文件没有注释):

[Unit]
Description=Frp Server Service # 服务描述
After=network.target # frps 将会在 network.service 启动完毕之后再启动

[Service]
Type=simple # 不论进程是否启动成功,systemctl start 都执行成功
User=nobody # 设置进程在执行时使用的用户
Restart=on-failure # on-failure 表示仅在服务进程异常退出时重启
RestartSec=5s # 设置在重启服务前暂停多长时间
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini # 在启动该服务时需要执行的命令行

[Install]
WantedBy=multi-user.target # 用于 systemctl enable 时创建软连接

将这个文件拷贝到 /etc/systemd/system/ 目录下,根据 systemd 的官方文档,放在下面哪个路径都是可以的。

/etc/systemd/system/ - Prio 1 
/run/systemd/system/ - Prio 2 
/lib/systemd/system/ - Prio 3 
/usr/lib/systemd/system/ - Prio 3 

并根据配置文件中的 ExecStart=/usr/bin/frps -c /etc/frp/frps.ini 将文件放置到对应的路径下。这个非常重要!

启动 frps 服务

> sudo systemctl start frps.service

查看 frps 服务的状态

> sudo systemctl status frps.service
● frps.service - Frp Server Service
   Loaded: loaded (/etc/systemd/system/frps.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-01-24 22:19:29 CST; 14s ago
 Main PID: 13201 (frps)
    Tasks: 6 (limit: 4658)
   CGroup: /system.slice/frps.service
           └─13201 /usr/bin/frps -c /etc/frp/frps.ini

Jan 24 22:19:29 ecs-curledgoat systemd[1]: Started Frp Server Service.
Jan 24 22:19:29 ecs-curledgoat frps[13201]: 2022/01/24 22:19:29 [I] [root.go:200] frps uses config file: /etc/frp/frps.ini
Jan 24 22:19:29 ecs-curledgoat frps[13201]: 2022/01/24 22:19:29 [I] [service.go:192] frps tcp listen on 0.0.0.0:7000
Jan 24 22:19:29 ecs-curledgoat frps[13201]: 2022/01/24 22:19:29 [I] [root.go:209] frps started successfully

停止 frps:

> sudo systemctl stop frps.service

开启 frps 服务开机自启动:

> systemctl enable frps.service
> Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /etc/systemd/system/frps.service.

禁用 frps 服务开机自启动:

> sudo systemctl disable frps.service
Removed /etc/systemd/system/multi-user.target.wants/frps.service.

基于单元模板文件管理 frps 服务

frps 的单元模板文件是 frps@.service,相比单元文件多了一个 @ 符号。我们可以在 @ 符号和 .service 文件后缀的中间加入一个参数(这个参数会被用于设置一些替换符,比如 %i),比如 frps@test.service,这样我们就基于单元模板文件实例化了一个 frps@test 服务。
来看一下 frps@.service 的内容:

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/%i.ini
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

我们可以发现,ExecStart 中 frps 使用的配置文件的名称使用了替换符 %i,这个 %i 的值是 @ 符号和 .service 文件后缀中间的内容,比如 frps@test.service,那么 %i 就等于 test,也是说 frps 的配置文件就变成了 /etc/frp/test.ini,这样就可以根据不同的实例选择不同的配置文件。

同样我们需要先将 frps@.service 文件拷贝到 /etc/systemd/system/ 目录下:

> sudo cp /path/to/frps@.service /etc/systemd/system/

如果我们需要基于 frps@.service 单元模板文件实例化(启动)一个服务时,比如 frps@test.service,我们只需要执行 systemctl start 命令,这样就会基于单元模板文件实例化一个服务(我们并不需要拥有一个单元文件 /etc/systemd/system/frps@test.service):

> sudo systemctl start frps@test

查看 frps@test 服务的状态:

> sudo systemctl status frps@test
● frps@test.service - Frp Server Service
   Loaded: loaded (/usr/lib/systemd/system/frps@.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2021-06-12 02:02:51 CST; 5s ago
 Main PID: 31171 (frps)
   CGroup: /system.slice/system-frps.slice/frps@test.service
           └─31171 /usr/bin/frps -c /etc/frp/test.ini

Jun 12 02:02:51 iZwz93g2xezuhc0vzfgsy6Z systemd[1]: Started Frp Server Service.
Jun 12 02:02:51 iZwz93g2xezuhc0vzfgsy6Z frps[31171]: 2021/06/12 02:02:51 [I] [root.go:200] frps uses config file: /etc/frp/test.ini
Jun 12 02:02:51 iZwz93g2xezuhc0vzfgsy6Z frps[31171]: 2021/06/12 02:02:51 [I] [service.go:192] frps tcp listen on 0.0.0.0:7000
Jun 12 02:02:51 iZwz93g2xezuhc0vzfgsy6Z frps[31171]: 2021/06/12 02:02:51 [I] [root.go:209] frps started successfully

停止 frps@test 服务:

> sudo systemctl stop frps@test

开启 frps@test 服务开机自启动(指向的是单元模板文件):

> sudo systemctl enable frps@test 
Created symlink from /etc/systemd/system/multi-user.target.wants/frps@test.service to /usr/lib/systemd/system/frps@.service.

禁用 frps@test 服务开机自启动:

> sudo systemctl disable frps@test
Removed symlink /etc/systemd/system/multi-user.target.wants/frps@test.service.
举报

相关推荐

0 条评论