systemd 与服务管理

systemd 是 Linux 主流的 init 系统和服务管理器,负责系统启动(PID 1)、服务生命周期管理、日志收集和定时任务。RHEL 7+、Ubuntu 16.04+、Debian 8+ 均使用 systemd。

Unit 类型

Unit 类型后缀用途
Service.service守护进程和服务
Socket.socketSocket 激活(按需启动)
Timer.timer定时任务(替代 cron)
Target.target启动阶段分组
Mount.mount文件系统挂载

Unit 文件搜索路径(优先级从高到低):

/etc/systemd/system/          # 管理员自定义
/run/systemd/system/          # 运行时生成
/usr/lib/systemd/system/      # 软件包安装

Service Unit 文件

[Unit]
Description=My Application Server
After=network.target postgresql.service
Requires=postgresql.service
Wants=redis.service

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
EnvironmentFile=/opt/myapp/.env
ExecStart=/opt/myapp/bin/server
Restart=on-failure
RestartSec=5
StartLimitIntervalSec=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

Type 决定状态跟踪方式:simple(主进程即 ExecStart 进程)、forking(fork 到后台)、oneshot(执行一次后退出)、notify(通过 sd_notify 通知就绪)。

依赖关系:Requires= 强依赖、Wants= 弱依赖、After=/Before= 仅控制顺序、Conflicts= 互斥。

常用命令

# 服务管理
systemctl start/stop/restart nginx       # 管理生命周期
systemctl status nginx -l                # 查看状态和日志片段
systemctl enable/disable nginx           # 开机自启
systemctl daemon-reload                  # 修改 unit 文件后重载
systemctl --failed                       # 列出失败的服务
systemctl list-dependencies nginx        # 依赖树

# 日志查询
journalctl -u nginx -f                   # 实时跟踪
journalctl -u nginx -n 200               # 最近 200 条
journalctl --since "1h ago"              # 按时间范围
journalctl -p err                        # 只看错误
journalctl -b                            # 本次启动的日志
journalctl -k                            # 内核日志
journalctl --disk-usage                  # 日志占用空间
journalctl --vacuum-time=7d              # 清理旧日志

Timer 定时任务

Timer unit 替代 cron,提供更好的日志集成。配置示例:OnCalendar=*-*-* 02:00:00(每天凌晨 2 点)、RandomizedDelaySec=900(随机延迟)。systemctl list-timers 查看所有 timer,systemctl enable --now backup.timer 启用。

SRE 实践场景

服务崩溃排查

systemctl status myapp -l --no-pager     # 状态和日志
journalctl -u myapp -n 200               # 完整日志
dmesg | grep -i "oom\|killed"            # OOM 检查
systemctl show myapp -p NRestarts        # 重启次数

启动时间优化

systemd-analyze                          # 总启动耗时
systemd-analyze blame | head -20         # 各服务耗时排名
systemd-analyze critical-chain           # 关键路径

优化策略:非关键服务延迟启动、用 socket activation 替代直接启动、禁用不需要的服务。

journald 配置与资源限制

/etc/systemd/journald.conf 关键参数:SystemMaxUse=2G(最大占用)、MaxRetentionSec=30day(保留时间)、Compress=yes(压缩旧日志)。修改后 systemctl restart systemd-journald 生效,journalctl --vacuum-size=1G 手动清理。

Service 资源限制与安全加固:

[Service]
MemoryMax=4G                             # 内存上限
CPUQuota=200%                            # CPU 限制
LimitNOFILE=65536                        # 文件描述符
PrivateTmp=true                          # 独立 /tmp
NoNewPrivileges=true                     # 禁止提权
ProtectSystem=strict                     # 只读文件系统