进程与 systemd 服务管理
“服务能跑”不等于“服务可运维”。真正的最小生产标准,是它能被 systemd 管起来。
systemd 的角色
graph TD
A[开机] --> B[systemd]
B --> C[启动服务]
C --> D[监控退出状态]
D --> E[按策略重启]
D --> F[写入 journal]
systemd 服务状态机
graph TD
A[disabled] -->|systemctl enable| B[enabled]
B -->|systemctl start| C[active/running]
C -->|进程崩溃| D[activating/restart]
D -->|重启成功| C
D -->|超过 StartLimitBurst| E[failed]
C -->|systemctl stop| F[inactive]
E -->|systemctl reset-failed| F
常用命令速查
# 查看状态(最常用)
systemctl status myapp # 进程状态 + 最近日志片段
systemctl is-active myapp # 脚本中判断是否运行:返回 "active" 或 "inactive"
systemctl is-enabled myapp # 是否开机自启
# 控制
sudo systemctl start myapp
sudo systemctl stop myapp
sudo systemctl restart myapp
sudo systemctl reload myapp # 重新加载配置(不杀进程,需应用支持)
# 开机自启
sudo systemctl enable myapp # 启用开机自启
sudo systemctl enable --now myapp # 启用 + 立即启动(组合操作)
sudo systemctl disable myapp # 禁用开机自启
# 修改 .service 文件后必须执行
sudo systemctl daemon-reload
# 日志
journalctl -u myapp -f # 追踪实时日志
journalctl -u myapp -n 100 --no-pager # 最近 100 行
journalctl -u myapp --since "30 min ago" # 最近 30 分钟
journalctl -u myapp --since "2026-03-22 02:00" --until "2026-03-22 03:00"
一个标准 service 文件
[Unit]
Description=My App
After=network.target
[Service]
User=app
WorkingDirectory=/opt/myapp/current
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
故障快速排查
| 症状 | 可能原因 | 排查命令 |
|---|---|---|
Active: failed 红色 | ExecStart 程序崩溃或路径错误 | journalctl -u myapp -n 50 |
Start request repeated too quickly | 崩溃循环,触发速率限制 | systemctl reset-failed myapp 再 start |
| 开机后未自启 | 未执行 enable | systemctl is-enabled myapp |
| 修改 .service 无效 | 未执行 daemon-reload | sudo systemctl daemon-reload |
Failed to connect to bus | 在容器/chroot 中执行了 systemctl | 容器内不使用 systemd,改用进程管理器 |
常见误区
- 用
nohup后台跑服务就以为算上线 —nohup进程崩溃后不会重启,也没有日志管理 Restart=always导致exit 0的正常停止也被重启 — 生产推荐Restart=on-failure- 服务启动目录不明确,导致加载错配置 — 必须设置
WorkingDirectory - 修改 .service 后直接 restart — 必须先
daemon-reload
本节执行清单
- [ ] 把一个后台进程改成 systemd 管理(含
[Unit]、[Service]、[Install]三段) - [ ] 用
journalctl -u myapp -f查看实时启动日志 - [ ] 验证服务在重启机器后能自动拉起(
systemctl is-enabled myapp返回enabled) - [ ] 故意制造崩溃(
kill -9),确认自动重启生效
下一节:包管理、环境变量与日志——继续把日常维护动作标准化。