systemd 与服务管理
systemd 是 Ubuntu 26.04 的初始化系统和服务管理器,负责引导系统启动、管理系统服务和守护进程。掌握 systemd 是 Ubuntu 系统管理的必备技能。
systemctl 基本用法
管理服务状态
# 启动服务
sudo systemctl start nginx
# 停止服务
sudo systemctl stop nginx
# 重启服务
sudo systemctl restart nginx
# 重新加载配置(不中断服务)
sudo systemctl reload nginx
# 如果支持 reload 则 reload,否则 restart
sudo systemctl reload-or-restart nginx
# 查看服务状态
systemctl status nginx开机启动管理
# 设置开机自启
sudo systemctl enable nginx
# 取消开机自启
sudo systemctl disable nginx
# 设置开机自启并立即启动
sudo systemctl enable --now nginx
# 禁止服务被启动(包括手动启动)
sudo systemctl mask nginx
# 取消禁止
sudo systemctl unmask nginx查看服务信息
# 列出所有正在运行的服务
systemctl list-units --type=service --state=running
# 列出所有已安装的服务
systemctl list-unit-files --type=service
# 列出失败的服务
systemctl list-units --failed
# 查看服务的依赖关系
systemctl list-dependencies nginx
# 查看服务的详细属性
systemctl show nginx
# 查看服务是否处于活动状态
systemctl is-active nginx
# 查看服务是否已启用开机自启
systemctl is-enabled nginx服务单元文件
单元文件位置
systemd 服务单元文件按优先级从高到低存放在以下位置:
| 路径 | 说明 |
|---|---|
/etc/systemd/system/ | 系统管理员自定义,优先级最高 |
/run/systemd/system/ | 运行时生成的单元文件 |
/lib/systemd/system/ | 软件包安装的默认单元文件 |
查看单元文件
# 查看服务的单元文件内容
systemctl cat nginx.service
# 查看单元文件路径
systemctl show -p FragmentPath nginx.service
# 编辑单元文件(创建 override)
sudo systemctl edit nginx.service
# 编辑完整单元文件
sudo systemctl edit --full nginx.service单元文件结构
一个典型的服务单元文件由三个部分组成:
[Unit]
Description=服务描述
Documentation=https://example.com/docs
After=network.target
Wants=network-online.target
Requires=postgresql.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp
ExecStartPre=/opt/myapp/pre-start.sh
ExecStart=/opt/myapp/start.sh
ExecStop=/opt/myapp/stop.sh
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
Environment=NODE_ENV=production
EnvironmentFile=/opt/myapp/.env
[Install]
WantedBy=multi-user.target常用 Service Type
| 类型 | 说明 |
|---|---|
simple | 默认值,ExecStart 启动的进程即为主进程 |
forking | 服务会 fork 子进程,父进程退出后视为启动完成 |
oneshot | 一次性任务,进程退出后视为完成 |
notify | 服务启动完成后通过 sd_notify 通知 systemd |
idle | 类似 simple,但等待其他任务执行完毕后再启动 |
重启策略
| 选项 | 说明 |
|---|---|
no | 不自动重启(默认) |
on-success | 正常退出时重启 |
on-failure | 非正常退出时重启 |
on-abnormal | 被信号杀死或超时时重启 |
on-abort | 被未捕获的信号杀死时重启 |
always | 无论何种原因退出都重启 |
创建自定义服务
示例:Node.js 应用服务
创建单元文件:
sudo nano /etc/systemd/system/myapp.service写入以下内容:
[Unit]
Description=My Node.js Application
After=network.target
[Service]
Type=simple
User=nodeapp
Group=nodeapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node /opt/myapp/server.js
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
Environment=NODE_ENV=production PORT=3000
# 安全加固
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/opt/myapp/data
PrivateTmp=yes
[Install]
WantedBy=multi-user.target启用并启动服务:
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl enable --now myapp.service
# 查看状态
systemctl status myapp.service
# 查看日志
journalctl -u myapp.service -f示例:Python 应用服务
[Unit]
Description=Python Flask Application
After=network.target
[Service]
Type=simple
User=flask
Group=flask
WorkingDirectory=/opt/flask-app
ExecStart=/opt/flask-app/venv/bin/gunicorn -w 4 -b 0.0.0.0:8000 app:app
Restart=always
RestartSec=5
Environment=FLASK_ENV=production
[Install]
WantedBy=multi-user.target示例:带看门狗的服务
[Unit]
Description=Critical Service with Watchdog
After=network.target
[Service]
Type=notify
ExecStart=/opt/critical/run.sh
WatchdogSec=30
Restart=on-failure
RestartSec=5
# 失败后自动重启,最多尝试 5 次
StartLimitIntervalSec=300
StartLimitBurst=5
[Install]
WantedBy=multi-user.target使用 override 修改现有服务
不建议直接修改 /lib/systemd/system/ 中的文件,而是使用 override:
# 创建 override 文件
sudo systemctl edit nginx.service这会打开编辑器,在其中添加要覆盖的配置:
[Service]
# 增加内存限制
MemoryMax=512M
# 修改重启策略
Restart=always
RestartSec=3override 文件保存在 /etc/systemd/system/nginx.service.d/override.conf。
# 查看合并后的完整配置
systemctl cat nginx.service
# 重新加载配置
sudo systemctl daemon-reload
sudo systemctl restart nginx系统管理命令
# 查看启动耗时
systemd-analyze
# 查看各服务启动耗时(按时间排序)
systemd-analyze blame
# 查看启动链路图
systemd-analyze critical-chain
# 查看当前运行级别
systemctl get-default
# 设置默认运行级别
sudo systemctl set-default multi-user.target # 命令行模式
sudo systemctl set-default graphical.target # 图形界面模式
# 关机和重启
sudo systemctl poweroff
sudo systemctl reboot
# 挂起和休眠
sudo systemctl suspend
sudo systemctl hibernate资源限制
可以在服务单元文件中设置资源限制:
[Service]
# CPU 限制
CPUQuota=50%
# 内存限制
MemoryMax=1G
MemoryHigh=800M
# I/O 限制
IOWeight=100
IOReadBandwidthMax=/dev/sda 10M
# 进程数限制
TasksMax=100
# 文件描述符限制
LimitNOFILE=65535故障排除
# 查看服务失败原因
systemctl status myapp.service
journalctl -u myapp.service --no-pager -n 50
# 验证单元文件语法
systemd-analyze verify /etc/systemd/system/myapp.service
# 查看 systemd 自身日志
journalctl -b _PID=1
# 重置失败计数
sudo systemctl reset-failed myapp.service相关文章
- journalctl 日志查询 — 使用 journalctl 查看和过滤 systemd 服务日志
- 定时任务(cron) — 使用 cron 和 systemd timer 设置周期性定时任务
Last updated on