Skip to Content
文档运维系统管理systemd 与服务管理

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=3

override 文件保存在 /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

相关文章

Last updated on