systemd-unit
systemd 是主流 Linux 发行版的系统与服务管理器,Unit 文件是它的配置单元:定义"一个服务/定时任务/挂载点如何启动、何时启动"。日常用的 systemctl start/status(见 Linux系统管理)只是管理接口,真正决定行为的写在 /etc/systemd/system/*.service 等 Unit 文件里。理解 Unit 文件,才能"把一个程序做成开机自启的系统服务"。
Unit 类型与文件位置
| 类型 | 后缀 | 用途 |
|---|---|---|
| Service | .service | 服务/守护进程(最常用) |
| Timer | .timer | 定时任务(替代 cron) |
| Mount / Automount | .mount / .automount | 挂载点 |
| Socket | .socket | 套接字激活的服务 |
| Target | .target | 服务分组(如 multi-user.target 多用户启动) |
| 位置 | 用途 |
|---|---|
/usr/lib/systemd/system/ | 软件包自带(勿改) |
/etc/systemd/system/ | 管理员自定义(覆盖优先级最高) |
Service Unit 文件结构
[Unit]
Description=订单服务 # 描述
After=network-online.target mysql.service # 启动顺序:等网络和 MySQL 就绪
Wants=network-online.target # 弱依赖(尽量启动,失败不阻塞)
[Service]
Type=simple # 启动类型(见下表)
User=appuser # 运行用户(绝不用 root)
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -jar /opt/app/app.jar # 启动命令
ExecStop=/usr/bin/kill -TERM $MAINPID # 停止命令
Restart=on-failure # 失败自动重启
RestartSec=3 # 重启间隔
Environment="JAVA_OPTS=-Xmx512m" # 环境变量
EnvironmentFile=/etc/app/app.env # 从文件加载环境变量
[Install]
WantedBy=multi-user.target # 开机自启:加入多用户启动目标Type 的选择
| Type | 适用 | 判断方式 |
|---|---|---|
simple(默认) | 前台常驻进程(Java/Node 服务) | 主进程直接运行 |
forking | 启动后 fork 出子进程的旧式守护进程 | ExecStart 需配 PIDFile |
oneshot | 一次性任务(初始化脚本) | 执行完即退出 |
notify | 支持 sd_notify 通知就绪 | systemd 收到就绪信号才算启动完成 |
Java/Node 服务用 simple 即可;ExecStart 建议用绝对路径(systemd 环境 PATH 受限)。
Timer:systemd 的定时任务
Timer 替代 cron:独立 .timer 文件 + 对应 .service 文件,支持单调时间(相对上次)与日历时间:
# /etc/systemd/system/backup.timer
[Unit]
Description=每日备份
[Timer]
OnCalendar=*-*-* 02:30:00 # 日历时间:每天 02:30
Persistent=true # 错过执行时间(关机)后补执行
[Install]
WantedBy=timers.target# /etc/systemd/system/backup.service
[Unit]
Description=执行备份脚本
[Service]
Type=oneshot # 一次性任务
ExecStart=/opt/scripts/backup.shsystemctl daemon-reload
systemctl enable --now backup.timer # 启用定时器
systemctl list-timers # 查看所有定时任务常用管理命令
| 命令 | 作用 |
|---|---|
systemctl daemon-reload | 修改 Unit 文件后重载(必须执行) |
systemctl enable --now app.service | 开机自启 + 立即启动 |
systemctl disable app.service | 取消开机自启 |
systemctl status app.service | 查看状态与最近日志 |
journalctl -u app.service -f | 跟踪该服务日志(systemd 统一日志) |
systemctl list-units --type=service | 列出所有服务 |
systemctl is-enabled app.service | 查是否开机自启 |
常见问题
| 问题 | 处理 |
|---|---|
| 改配置不生效 | 改后必须 systemctl daemon-reload 再 restart |
| 服务启动就退出 | 先 systemctl status 看错误;Type=oneshot 的任务检查 ExecStart 权限 |
| 找不到命令 | ExecStart 用绝对路径(systemd 不加载用户 PATH) |
| 权限不足 | 设 User= 专用用户,数据目录 chown 给该用户 |
| 依赖的服务没起来 | 调 After=/Wants= 明确顺序,systemd-analyze verify 校验 |
systemd 与 Linux系统管理 的服务管理、Linux启动流程 的 init 演进、shell脚本 的自动化配合,是 Linux 运维的日常基础。