OPTY

Debian/Ubuntu在生产环境中运行后台服务

使用systemd运行后台服务


Debian/Ubuntu 中运行后台服务有多种方式常见的几种方法有systemd服务、screen/tmux、nohup、supervisord等

nohup虽然简单,但缺乏管理功能。

supervisord适合需要监控的进程,特别是非守护进程的应用。

而screen/tmux可能在临时测试时使用,但生产环境不推荐,因为不够可靠。

systemd是Debian默认的初始化系统,管理服务比较正规,支持启动、重启、日志等,生产环境中是首选。

 

在 Systemd 的服务配置中,守护进程(Daemon)非守护进程(Non-Daemon)的区别及其配置参数是关键。以下是详细解析:

特性 守护进程(Daemon) 非守护进程(Non-Daemon)
运行模式 自行后台运行,脱离终端控制(如 Nginx、MySQL) 默认前台运行,依赖终端(如 Python Flask)
Systemd 处理 无需特殊配置,启动后自动释放控制权 需配置 Type=simple 或 Type=forking
监控需求 通常无需自动重启(除非崩溃) 需配置 Restart=always 防止进程退出
日志管理 通常自行处理日志(写入文件或 syslog) 依赖 Systemd 捕获输出(建议重定向到日志)

 

 如何判断程序类型?

  • 守护进程:启动后父进程退出,子进程转为后台(如 nginx -g "daemon off;" 强制前台运行)。

  • 非守护进程:启动后阻塞前台(如 Node.js 的 app.listen())。

这里是一个systemd的使用记录

(值得注意的是,真正的配置文件中不可以使用#注释)

实现步骤:

  1. 创建服务单元文件
    在 /etc/systemd/system/ 下新建 .service 文件(如 myapp.service):

    [Unit]
    Description=我的自定义应用服务   # 服务描述,用于日志和状态显示
    After=network.target          # 定义启动顺序:在网络就绪后启动本服务
    
    [Service]
    User=appuser                  # 指定运行服务的用户(需提前创建)
    Group=appgroup                # 指定运行服务的用户组
    WorkingDirectory=/opt/myapp   # 服务的工作目录(影响文件路径)
    ExecStart=/usr/bin/python3 /opt/myapp/main.py  # 启动命令(必须是绝对路径)
    Restart=always                # 重启策略:任何原因退出都自动重启
    RestartSec=5                  # 重启间隔时间(单位:秒)
    Environment="KEY=value"       # 设置环境变量(可定义多个)
    LimitNOFILE=65535             # 限制进程最大打开文件数
    
    [Install]
    WantedBy=multi-user.target    # 指定服务关联的系统目标(常规多用户模式)

     

  2. 启用并启动服务
    sudo systemctl daemon-reload
    sudo systemctl enable myapp  # 开机自启
    sudo systemctl start myapp
  3. 查看服务状态
    sudo systemctl status myapp
    journalctl -u myapp -f  # 查看实时日志

二、配置参数详解(以你的示例文件为例)

1. [Unit] 部分

  • Description
    服务描述信息,用于日志和状态显示(建议简明扼要)。

  • After=network.target
    定义启动顺序:确保网络就绪后再启动服务。类似参数还有 Requires(强依赖)和 Wants(弱依赖)。

2. [Service] 部分

  • User 和 Group
    以非 root 用户运行服务,提升安全性(需提前创建用户:adduser appuser)。

  • WorkingDirectory
    服务的工作目录,影响文件路径解析(如脚本中的相对路径)。

  • ExecStart
    核心参数:启动命令的完整路径。
    ⚠️ 注意:

    • 若程序是前台模式(非守护进程),必须直接在此指定命令(如 /usr/bin/python3 app.py)。

    • 若程序是守护进程(自行后台化),需设置 Type=forking 并指定 PIDFile

  • Restart
    进程退出后的重启策略,常用选项:

    行为
    no 不重启(默认)
    always 任何原因退出都重启
    on-failure 非正常退出时重启(退出码非0或被信号终止)
    unless-stopped 除非手动停止,否则总是重启
  • RestartSec
    重启间隔时间(单位:秒),避免频繁崩溃时快速重启。

  • Environment
    设置环境变量,支持多个值:

     
    Environment="KEY1=value1" "KEY2=value2"
  • LimitNOFILE
    资源限制参数,控制进程最大打开文件数。类似参数还有:

    • LimitCPU(CPU 时间限制)

    • LimitAS(内存限制)

    • LimitNPROC(最大进程数)

3. [Install] 部分

  • WantedBy=multi-user.target
    定义服务在哪个 Systemd 目标(target)下启用,multi-user.target 表示多用户命令行模式。