核心 · Key Idea
一句话:systemd 是 Linux PID 1 init,统一管理服务、依赖、日志、定时器、cgroup 资源限制。部署生产服务的标准方法就是写一个 service unit。
是什么#
最小 service unit /etc/systemd/system/myapp.service:
[Unit]
Description=My App
After=network.target
[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/serve
Restart=on-failure
RestartSec=5
Environment="PORT=8080"
LimitNOFILE=65536
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now myapp
journalctl -u myapp -f打个比方#
打个比方 · Analogy
systemd 像写字楼物业:决定哪个公司什么时候开门(启动顺序)、断电怎么恢复(自动重启)、谁能用多少电(cgroup)、保安记什么日志(journal)。
关键概念#
Unit单元
service / socket / timer / mount / target 等。一切皆 unit。
Target目标
类似 runlevel 的状态集合,multi-user.target 是常态。
依赖Wants/Requires/After
Wants 弱依赖、Requires 强依赖、After 顺序。
Restart 策略Restart
no/always/on-failure/on-abnormal。生产用 on-failure + RestartSec。
Type服务类型
simple(前台)/ forking(fork 后退出)/ notify(自报告就绪)/ oneshot(跑完即可)。
Drop-in/etc/systemd/system/<unit>.d/override.conf
覆盖部分字段而不动原 unit。
Timer定时器
替代 cron,更灵活更可观测。
常用命令#
systemctl status nginx
systemctl start / stop / restart / reload nginx
systemctl enable --now nginx # 开机自启 + 立刻启
systemctl disable --now nginx
systemctl daemon-reload # unit 文件改了之后必跑
systemctl list-units --type=service
systemctl edit nginx # 创建 drop-in override
journalctl -u nginx -f
systemd-analyze blame # 谁拖慢了开机怎么工作#
systemd 用 cgroup 跟踪每个 service 的所有子进程 —— 进程 fork 也跑不掉。
实操要点#
-
生产服务必加:
Restart=on-failure+RestartSec=+LimitNOFILE+ 专属User=。 -
安全沙箱字段值得用:
ProtectSystem=strict、ProtectHome=true、PrivateTmp=true、NoNewPrivileges=true、CapabilityBoundingSet=—— 零成本降低被打穿后的横向风险。 -
资源限制:
MemoryMax=2G、CPUQuota=50%—— 比 ulimit 更现代。 -
timer 替代 cron:
# /etc/systemd/system/backup.timer [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target -
systemd-cgtop:top 风格看每个 service 的实际资源占用。 -
socket 激活:监听端口 → 来连接才拉起服务,省内存。
易混点#
systemd
自动重启 + 日志 + cgroup + 依赖。
生产标准。
生产标准。
SysV init / 自己 nohup
一段 sh 脚本启动。
崩了不重启、日志散乱、不可观测。
崩了不重启、日志散乱、不可观测。