systemd 常用命令速查
服务生命周期
| 命令 |
说明 |
systemctl start nginx |
启动 |
systemctl stop nginx |
停止 |
systemctl restart nginx |
重启(含 stop + start) |
systemctl reload nginx |
重载配置(不中断连接,需服务支持) |
systemctl reload-or-restart nginx |
能重载就重载,否则重启 |
systemctl status nginx |
查看状态与最近日志 |
systemctl enable nginx |
开机自启 |
systemctl disable nginx |
取消开机自启 |
systemctl mask nginx |
屏蔽(连手动启动都不允许) |
systemctl unmask nginx |
解除屏蔽 |
查看与检索
# 列出所有运行中的服务
systemctl list-units --type=service --state=running
# 列出所有失败的服务
systemctl list-units --state=failed
# 列出所有已安装的服务单元(含未启动)
systemctl list-unit-files --type=service
# 查看某服务的所有依赖关系
systemctl list-dependencies nginx
systemctl list-dependencies --reverse nginx # 谁依赖我
日志:journalctl
# 查看某服务日志,实时跟踪
journalctl -u nginx -f
# 最近 100 行
journalctl -u nginx -n 100
# 按时间范围
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx --since "2026-10-01" --until "2026-10-02"
# 只看错误级别及以上
journalctl -u nginx -p err
# 查看本次启动以来的日志
journalctl -u nginx -b
# 按进程/PID 过滤
journalctl _PID=1234
# 输出 JSON 便于解析
journalctl -u nginx -o json-pretty -n 10
日志占用清理
# 查看日志占用
journalctl --disk-usage
# 只保留最近 3 天
journalctl --vacuum-time=3d
# 或限制总大小
journalctl --vacuum-size=500M
单元文件速写
# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
Environment="ENV=prod" "LOG_LEVEL=info"
EnvironmentFile=-/etc/myapp/env # 前缀 - 表示文件不存在也不报错
ExecStart=/opt/myapp/bin/server
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
# 资源限制
MemoryMax=2G
OOMScoreAdjust=-500
# 安全加固
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
[Install]
WantedBy=multi-user.target
重载单元文件
修改 .service 文件后必须执行:
systemctl daemon-reload
systemctl restart myapp
忘记 daemon-reload 是「改了配置却不生效」的头号原因。
Type 的选择
| Type |
适用场景 |
判据 |
simple |
前台常驻进程(默认) |
ExecStart 启动即视为就绪 |
forking |
会 daemon 化的传统程序 |
父进程退出即就绪 |
oneshot |
一次性任务 |
进程退出才算完成 |
notify |
支持 sd_notify 的程序 |
收到 READY=1 |
exec |
需要确认二进制可执行 |
exec 成功即就绪 |
定时器(替代 cron)
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true # 错过的时间点开机后补跑
[Install]
WantedBy=timers.target
systemctl enable --now backup.timer
systemctl list-timers --all
# 验证 OnCalendar 表达式
systemd-analyze calendar "*-*-* 03:00:00"
相比 cron,systemd timer 的优势:日志统一进 journal、支持错过补跑、可用 systemd-analyze 校验。
排障常用
# 看启动过程耗时
systemd-analyze blame | head -20
systemd-analyze critical-chain
# 检查单元文件语法
systemd-analyze verify /etc/systemd/system/myapp.service
# 查看最终生效的配置(含 drop-in 覆盖)
systemctl show myapp
# drop-in 覆盖(不改主文件)
mkdir -p /etc/systemd/system/myapp.service.d
cat > /etc/systemd/system/myapp.service.d/override.conf <<'EOF'
[Service]
Environment="DEBUG=true"
EOF
systemctl daemon-reload
小结
- 改单元文件后第一反应永远是
daemon-reload。
journalctl -u <svc> -f 应该成为你的条件反射。
- 用 drop-in 覆盖而不是直接改主文件,升级时不会冲突。