背景介绍※
家里的服务器(4070s)由于没有公网ip,一直是通过我的云服务器(TencentCloud-Tokyo)利用frp进行内网穿透的。今天我在TencentCloud-Tokyo上部署VanBlog(强烈安利!),但是服务器不堪重负死机了,导致我需要重启它,重启之后我忘记启动frp了,这就是为什么4070s无法连接,也是为什么会有下面这段对话。

之前也有过一次这样的情况,我意识到的时候,已经过去了8个小时,看来很有必要把frp设置成开机自启的守护进程,刚好借此机会写一篇“如何在Linux系统设置守护进程”。
我在Linux上创建守护进程一般有三种形式,一种是nohup(no hang up),一种是screen,一种是Systemd,前两种在之前的博客里有过一些介绍,见“后台运行python脚本“,本文着重介绍最后一种,详细介绍如何使用 Systemd 来配置一个程序成为开机自启动的守护进程。我将通过frp这个具体的示例来说明整个过程。
什么是守护进程※
在 Linux 系统中,守护进程(Daemon)是一类在后台运行的进程,它们通常不与任何终端直接交互,而是为系统提供服务或运行任务。这些守护进程在系统启动时自动启动,通常用于运行 Web 服务器、数据库、系统监控工具等,Systemd的d就是daemon的缩写。
步骤 1: 准备好程序※
首先,确保你要设置为守护进程的程序已经在系统中,并且可以手动运行。例如,我使用的是 FRP(Fast Reverse Proxy) 服务,它是一个高性能的反向代理应用,我使用它进行内网穿透。我的程序路径为 /home/ubuntu/frp/frp
,配置文件为 /home/ubuntu/frp/frps.ini
。
步骤 2: 创建 Systemd 服务文件※
Systemd 是现代 Linux 系统中用于管理系统和服务的工具。我们可以使用 Systemd 创建一个服务单元文件,将程序配置为一个守护进程。
2.1 创建服务文件※
首先,打开终端并创建一个新的服务单元文件。这个文件会告诉 Systemd 如何启动、管理和停止程序。
sudo vim /etc/systemd/system/frps.service
2.2 配置服务文件※
在 frps.service
文件中,添加以下内容:
[Unit]
Description=FRP Server
After=network.target
[Service]
ExecStart=/home/ubuntu/frp/frp -c /home/ubuntu/frp/frps.ini
WorkingDirectory=/home/ubuntu/frp/
User=ubuntu
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
解释:
[Unit]
部分:定义服务的基本信息。Description
:为服务提供简短的描述。After=network.target
:表示在网络服务启动之后再启动frps
服务。
[Service]
部分:定义服务的执行方式。ExecStart
:指定启动程序的命令,/home/ubuntu/frp/frp
是程序的路径,-c /home/ubuntu/frp/frps.ini
是配置文件的路径。WorkingDirectory
:指定程序的工作目录,通常是程序的安装路径。User
:指定用哪个用户来运行服务,这里使用ubuntu
用户。Restart=always
:当程序崩溃时,Systemd 会自动重启该程序。RestartSec=3
:设置程序崩溃后重启前等待 3 秒。
[Install]
部分:指定服务的启动目标。WantedBy=multi-user.target
:表示该服务会在系统进入多用户模式后启动,适用于大部分常规服务。
步骤 3: 重新加载 Systemd 配置※
每次我们修改或创建新的服务文件时,都需要重新加载 Systemd 配置,以便它能够识别新的服务。
sudo systemctl daemon-reload
步骤 4: 启用开机自启※
为了让服务在每次系统启动时自动运行,我们需要启用服务。
sudo systemctl enable frps.service
4.1 启动服务※
现在,手动启动 frps
服务:
sudo systemctl start frps.service
4.2 检查服务状态※
可以通过以下命令检查服务的状态,确保它正常运行:
sudo systemctl status frps.service
如果服务成功启动,会看到类似如下的输出:
● frps.service - FRP Server
Loaded: loaded (/etc/systemd/system/frps.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-04-29 08:00:00 UTC; 2min ago
Main PID: 12345 (frps)
Tasks: 1 (limit: 4915)
Memory: 5.6M
CGroup: /system.slice/frps.service
└─12345 /home/ubuntu/frp/frp -c /home/ubuntu/frp/frps.ini
4.3 设置系统自动启动服务※
通过 systemctl enable
命令,frps
服务已配置为在每次系统启动时自动启动。如果想禁用该服务的开机自启,可以运行以下命令:
sudo systemctl disable frps.service
步骤 5: 查看日志※
如果服务没有正常启动,可以通过查看日志来获得更多信息:
sudo journalctl -u frps.service -f
这将输出与 frps
服务相关的实时日志,可以帮助你调试问题。
步骤 6: 停止和重启服务※
如果需要停止服务,可以使用以下命令:
sudo systemctl stop frps.service
如果需要重启服务,可以使用:
sudo systemctl restart frps.service
总结※
在 Linux 系统中使用 Systemd 配置一个守护进程并设置为开机自启是非常简单的。我们只需要创建一个服务单元文件,定义如何启动程序,并启用它为系统服务。这样,程序就能在系统启动时自动运行,并且在崩溃时会自动重启,确保长期稳定运行。通过这种方式,我们可以轻松地将任何程序配置为守护进程,适用于各种服务器和后台服务的应用。
参考资料※