Linux设置守护进程

-
-
2025-04-29

背景介绍

家里的服务器(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 配置一个守护进程并设置为开机自启是非常简单的。我们只需要创建一个服务单元文件,定义如何启动程序,并启用它为系统服务。这样,程序就能在系统启动时自动运行,并且在崩溃时会自动重启,确保长期稳定运行。通过这种方式,我们可以轻松地将任何程序配置为守护进程,适用于各种服务器和后台服务的应用。


参考资料


 

 


目录