进程与 systemd 服务管理
High Contrast
Dark Mode
Light Mode
Sepia
Forest
2 min read338 words

进程与 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,改用进程管理器

常见误区

本节执行清单

下一节包管理、环境变量与日志——继续把日常维护动作标准化。