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的使用记录
(值得注意的是,真正的配置文件中不可以使用#注释)
实现步骤:
-
创建服务单元文件
在/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 # 指定服务关联的系统目标(常规多用户模式) - 启用并启动服务
sudo systemctl daemon-reload sudo systemctl enable myapp # 开机自启 sudo systemctl start myapp - 查看服务状态
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表示多用户命令行模式。