systemd 服务配置 - 码剑客

从零编写 service 单元,到启用重载、日志查看、timer 定时任务与 drop-in 覆盖排查的实用片段。

systemd 245+更新于 2026-10-29共 31 条

Service 单元结构

可直接使用的 service 单元完整模板

[Unit]
Description=My App
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/my-app
EnvironmentFile=-/etc/my-app/env
ExecStart=/opt/my-app/bin/server --port 8080
Restart=always
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

改完 unit 必须 daemon-reload,否则改动不生效

用环境变量文件管理配置,避免写死在 unit 里

# /etc/my-app/env
NODE_ENV=production
PORT=8080

路径前加 - 表示文件不存在时不报错

前台运行的程序用 simple,脚本里要加 exec

Type=simple
ExecStart=/opt/my-app/bin/server

Type=forking 只适用于自己 daemon 化的程序

常用指令

启动前校验依赖,失败则不启动服务

ExecStartPre=/usr/bin/test -f /etc/my-app/config.yaml

设置工作目录,影响相对路径与日志位置

WorkingDirectory=/opt/my-app

用非 root 用户与属组运行服务

User=deploy
Group=deploy

直接声明单个环境变量

Environment=NODE_ENV=production

变量较多时改用 EnvironmentFile 更清晰

异常退出后自动重启,间隔 3 秒

Restart=always
RestartSec=3

配置写错会无限重启,先用 status 看原因

提高文件描述符上限,适合高并发服务

LimitNOFILE=65535

需要管道或重定向时显式调用 sh -c

ExecStart=/bin/sh -c 'cat /etc/my-app/list | xargs echo'

直接写 | 会被当成普通参数而不是管道

启用与重载

修改 unit 后重载配置

sudo systemctl daemon-reload

只重载配置不重启进程,还需再执行 restart

设置开机自启并立即启动服务

sudo systemctl enable --now my-app

查看运行状态与最近几行日志

sudo systemctl status my-app

重启服务,现有连接会被中断

sudo systemctl restart my-app

检查是否已设置开机自启

systemctl is-enabled my-app

取消开机自启并立即停止服务

sudo systemctl disable --now my-app

日志查看

实时跟踪指定服务的日志

journalctl -u my-app -f

只看最近十分钟的日志

journalctl -u my-app --since "10 min ago"

去掉元数据,只输出消息正文

journalctl -u my-app -o cat -n 200

只看本次启动的错误级别日志

journalctl -u my-app -p err -b
高危

只保留 7 天日志,其余永久删除

sudo journalctl --vacuum-time=7d

执行前用 --disk-usage 确认占用

定时任务 timer

被 timer 触发的任务单元,用 oneshot

[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh

每天凌晨 3 点执行,关机错过会补跑

[Unit]
Description=Run backup every night

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
Unit=backup.service

[Install]
WantedBy=timers.target

要 enable 的是 .timer,而不是 .service

查看全部定时器及下次触发时间

systemctl list-timers --all

启用并立即注册定时器

sudo systemctl enable --now backup.timer

校验时间表达式并显示下次触发

systemd-analyze calendar "*-*-* 03:00:00"

覆盖与排查

生成 drop-in 覆盖文件,不改动原 unit

sudo systemctl edit my-app

文件落在 /etc/systemd/system/my-app.service.d/

查看最终生效的 unit 与全部覆盖

systemctl cat my-app

静态检查 unit 语法与路径

systemd-analyze verify /etc/systemd/system/my-app.service

报错多为 ExecStart 路径不存在或依赖缺失

查看最近系统级错误与操作提示

journalctl -xe

列出启动失败的服务单元

systemctl --failed

相关工具

本网站使用 Cookie 以确保您在我们的网站上获得最佳体验。 隐私政策.