运维救援:Systemd 深度实战

现代 Linux 发行版几乎全部采用 Systemd。掌握了它,你就拥有了生产环境下的“系统管家”。


1. 现代指挥官:systemctl 核心

操作命令说明
开机自启sudo systemctl enable --now <svc>--now 同时实现 enable + start
查看状态systemctl status <svc>排障首选,显示运行树和最后日志
刷新配置sudo systemctl daemon-reload修改 .service 文件后必须执行
用户级别systemctl --user status <svc>无需 root,管理个人用户的后台服务
依赖分析systemctl list-dependencies <svc>查看该服务启动前需要等待哪些服务

2. 工业级 Unit 编写进阶

编写一个“稳健”的服务文件,需要考虑故障重试安全隔离资源限制

创建 /etc/systemd/system/app.service:

[Unit]
Description=Production API Service
After=network.target mysql.service
# 如果 mysql 没启动成功,本服务也不启动
Requires=mysql.service
 
[Service]
Type=simple
ExecStart=/usr/bin/node /home/susu/app.js
Restart=always
# 失败后每 5 秒尝试重启
RestartSec=5s
 
# --- 安全与限制 ---
User=susu
Group=susu
# 限制文件描述符数量 (解决 Too many open files)
LimitNOFILE=65535
# 私有 /tmp 目录,与系统隔离
PrivateTmp=true
# 设置只读路径,防止程序被黑后篡改核心配置
ReadOnlyPaths=/etc/myapp/config.yaml
 
[Install]
WantedBy=multi-user.target

systemd-run: 想让一个耗时很久的脚本在后台运行且不受终端退出影响?

sudo systemd-run --unit=my-task /home/susu/long-script.sh

你可以像管理普通服务一样用 systemctl stop my-task 来停止它。


3. 告别 Cron:Systemd Timer

相比老旧的 Cron,Systemd Timer 提供了:更精准的触发时间、更清晰的日志 (journalctl) 以及任务重试机制。

创建一个每天凌晨 3 点运行的任务
  1. 定义任务内容 (my-task.service):
    [Service]
    ExecStart=/usr/bin/backup-script.sh
  2. 定义触发时间 (my-task.timer):
    [Timer]
    # 每天凌晨 3 点
    OnCalendar=*-*-* 03:00:00
    # 确保错过时间后(如关机)开机立即补跑
    Persistent=true
     
    [Install]
    WantedBy=timers.target

4. 启动瓶颈分析

觉得电脑开机太慢?Systemd 自带了精准的“秒表”。

  • 总耗时: systemd-analyze
  • 各服务耗时排名: systemd-analyze blame
  • 关键路径分析: systemd-analyze critical-chain

5. 结业练习

Navigation