现代 Linux 发行版早已从 SysV init 迁移到 systemd。它不仅管开机启动,还管服务监控、日志收集、定时任务、资源控制。如果你的服务还在用 nohup + & 启动——是时候升级了。

Unit 文件编写

每个 systemd 服务对应一个 Unit 文件。以 Node.js 应用为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=My Node.js App
After=network.target postgresql.service

[Service]
Type=simple
User=app
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node dist/main.js
Restart=on-failure
RestartSec=10
Environment=NODE_ENV=production
EnvironmentFile=/etc/myapp/env

[Install]
WantedBy=multi-user.target

关键字段解读:After 定义启动顺序、Restart=on-failure 异常退出自动重启、EnvironmentFile 从外部文件加载环境变量避免写在 Unit 中。

常用命令

命令 作用
systemctl start/stop/restart name 启停服务
systemctl enable/disable name 开机自启/禁止
systemctl status name 查看状态
systemctl daemon-reload 重新加载 Unit 文件
systemctl list-units –state=failed 查看失败的服务

资源限制

systemd 可以直接在 Unit 文件中限制服务资源使用:

1
2
3
4
5
[Service]
MemoryMax=512M
CPUQuota=50%
TasksMax=100
LimitNOFILE=65536

MemoryMax 限制服务最多使用 512MB,超过会被 OOM 杀掉。CPUQuota 限制 CPU 使用率(单核 100% 为基准)。建议生产环境的所有服务都设置资源限制。

journalctl 日志排查

systemd 的日志系统叫 journal,用 journalctl 查看:

1
2
3
4
5
journalctl -u myapp          # 查看指定服务日志
journalctl -u myapp -f # 实时跟踪
journalctl -u myapp --since "1 hour ago"
journalctl -u myapp -p err # 只看错误级别
journalctl --disk-usage # 查看日志占用磁盘

建议限制日志大小避免占满磁盘:在 /etc/systemd/journald.conf 中设置 SystemMaxUse=500M。

systemd Timer:替代 cron

systemd Timer 可以替代 cron 做定时任务,优势是:支持单调时钟(不受系统时间调整影响)、支持随机延迟避免惊群效应、日志自动进入 journal。

总结

systemd 远不止开机启动。Unit 文件 + 资源限制保障服务稳定运行,journalctl 统一日志入口方便排查,Timer 现代化定时任务。掌握 systemd 是现代 Linux 运维的基本功。