Linux 系统中,systemd 已经成为大多数发行版的默认初始化系统,它不仅承担启动进程的责任,还提供了一套完整的服务管理机制。在 Ubuntu 系统中,了解和掌握 systemd 的使用,对于系统管理员、运维工程师以及开发者来说都是至关重要的技能。本文将从基础概念、常用命令、服务管理、定制服务以及高级应用几个方面,全面解析 Ubuntu 下 systemd 的使用方法,帮助你高效地管理和维护系统服务。
一、systemd 的基础概念
在深入操作之前,必须先理解 systemd 的核心概念。systemd 是 Linux系统的一种初始化(init)系统,它负责系统启动时加载和管理进程,并提供统一的服务管理接口。与传统的 SysVinit 相比,systemd 的优势在于并行启动服务、依赖管理和日志统一管理等。
1.1 服务单元(Unit)概念
在 systemd 中,所有可管理的对象都称为 Unit,每个 Unit 用一个特定的文件进行定义。常见的 Unit 类型包括:
- service:服务单元,用于定义后台守护进程。例如
nginx.service。 - socket:套接字单元,用于基于套接字的激活。
- target:目标单元,用于组织和组合多个服务,例如
multi-user.target。 - mount:挂载点单元,用于定义文件系统挂载。
- timer:定时器单元,用于替代 cron,执行周期性任务。
- path:路径单元,用于监控文件或目录变化触发服务。
- device:设备单元,用于管理硬件设备。
每个 Unit 都有自己的配置文件,通常位于 /etc/systemd/system/(用户自定义)或 /lib/systemd/system/(系统自带)。
1.2 Unit 文件结构
一个典型的服务 Unit 文件结构如下:
[Unit]
Description=示例服务
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/example
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit]部分用于描述服务和定义依赖关系。[Service]部分用于定义服务的运行方式、启动命令和重启策略。[Install]部分用于定义服务在启用(enable)时挂载到的目标。
二、systemd 常用管理命令
systemd 提供了 systemctl 命令来管理所有 Unit。掌握其用法是高效操作 Ubuntu 系统服务的关键。
2.1 服务启动与停止
启动服务:
sudo systemctl start 服务名.service
停止服务:
sudo systemctl stop 服务名.service
重启服务(相当于 stop + start):
sudo systemctl restart 服务名.service
重新加载服务配置(不停止服务):
sudo systemctl reload 服务名.service
2.2 服务状态查询
查看服务状态:
sudo systemctl status 服务名.service
输出信息包括服务是否运行、最近日志以及 PID 等信息,非常适合故障排查。
列出所有正在运行的服务:
systemctl list-units --type=service --state=running
2.3 服务开机自启与禁用
启用服务开机自启:
sudo systemctl enable 服务名.service
禁用服务开机自启:
sudo systemctl disable 服务名.service
查看某服务是否启用:
systemctl is-enabled 服务名.service
这些命令让你可以精确控制服务的启动行为,尤其适合生产环境。
三、使用 systemd 管理自定义服务
除了系统自带的服务,用户经常需要管理自定义应用或脚本。systemd 提供了简单的方法创建和管理自定义服务。
3.1 创建自定义服务 Unit 文件
假设我们有一个 Python 脚本 /home/ubuntu/myapp.py,希望将其作为服务运行:
- 创建 Unit 文件:
sudo nano /etc/systemd/system/myapp.service
- 填入如下内容:
[Unit]
Description=My Python Application
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/usr/bin/python3 /home/ubuntu/myapp.py
Restart=on-failure
[Install]
WantedBy=multi-user.target
这里 After=network.target 确保网络服务启动后再启动应用,Restart=on-failure 可以自动重启失败的服务。
3.2 重新加载 systemd 并启用服务
保存文件后,需要重新加载 systemd 配置:
sudo systemctl daemon-reload
然后启动并设置开机自启:
sudo systemctl start myapp.service
sudo systemctl enable myapp.service
验证服务状态:
sudo systemctl status myapp.service
如果出现错误,日志信息会显示在状态输出中,非常便于调试。
四、日志管理与故障排查
systemd 与传统的 syslog 不同,使用 journal 统一管理日志。所有服务的输出(stdout 和 stderr)都可以通过 journal 查看。
4.1 查看服务日志
使用 journalctl 命令:
sudo journalctl -u 服务名.service
显示最近日志:
sudo journalctl -u 服务名.service -n 50
实时跟踪日志输出:
sudo journalctl -u 服务名.service -f
4.2 日志持久化
默认情况下,systemd 日志只保存在内存中。要启用持久化日志,需要创建目录 /var/log/journal 并重启 systemd-journald 服务:
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
持久化日志可以确保服务器重启后仍能查看历史日志,便于长期监控和故障分析。
五、定时任务与 systemd timer
systemd 的 timer 单元是 cron 的现代替代方案,功能更强大、管理更统一。
5.1 创建 Timer Unit
假设希望每天凌晨 2 点运行脚本 /home/ubuntu/backup.sh:
- 创建服务单元
backup.service:
[Unit]
Description=Daily Backup Service
[Service]
Type=oneshot
ExecStart=/home/ubuntu/backup.sh
- 创建定时器单元
backup.timer:
[Unit]
Description=Run backup daily at 2AM
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
- 启用并启动定时器:
sudo systemctl daemon-reload
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
- 查看定时器状态:
systemctl list-timers --all
这样,定时任务由 systemd 完全管理,不再依赖传统 cron。
六、进阶应用与安全管理
systemd 提供了丰富的功能,可用于精细化控制服务行为。
6.1 限制资源与安全沙箱
在 [Service] 部分,可以添加资源限制:
CPUQuota=50%
MemoryLimit=500M
使用安全选项:
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=yes
这些选项可以隔离服务进程,避免对系统产生潜在威胁,适用于运行外部应用或网络服务的场景。
6.2 服务依赖与启动顺序
systemd 可以定义复杂的依赖关系:
After=mysql.service
Requires=mysql.service
这样可以确保数据库服务先于应用启动,避免应用因依赖未就绪而启动失败。
6.3 处理服务失败与自动重启
除了 Restart=on-failure,systemd 还支持高级重启策略:
RestartSec=10
StartLimitInterval=60
StartLimitBurst=5
以上配置表示在一分钟内服务失败超过 5 次,将停止自动重启。适合防止无限重启循环,保证系统稳定性。

全球服务器测评

