1. 什么是 systemd?
- 定义:systemd 是 Linux 系统的初始化系统(init system)和服务管理器,用于替代传统的
SysVinit
。 - 核心目标:
- 加速系统启动(并行化任务)。
- 统一管理服务、日志、挂载点等。
- 提供依赖关系解决和资源控制。
2. 核心功能与用途
2.1 服务生命周期管理
- 常用命令:
systemctl start nginx.service # 启动服务 systemctl stop nginx.service # 停止服务 systemctl restart nginx.service # 重启服务 systemctl reload nginx.service # 重载配置(不中断服务) systemctl status nginx.service # 查看状态(是否运行、日志片段)
- 关键场景:部署 Web 服务器、数据库等后台服务时,快速启停和状态监控。
2.2 开机自启管理
- 命令:
systemctl enable nginx.service # 启用开机自启 systemctl disable nginx.service # 禁用开机自启 systemctl is-enabled nginx # 检查是否已启用
- 原理:通过创建符号链接到
/etc/systemd/system
下的目标层级(如multi-user.target.wants
)。
2.3 依赖管理与并行启动
- 优势:
- 自动解决服务依赖(如“服务 A 必须在服务 B 之后启动”)。
- 并行启动独立服务,显著缩短系统启动时间。
- 查看依赖:
systemctl list-dependencies nginx.service # 显示服务的依赖树
2.4 故障恢复与日志
- 自动重启崩溃服务(需在服务文件中配置):
# 在 .service 文件中添加 Restart=on-failure # 仅在异常退出时重启 RestartSec=5s # 等待 5 秒后重启
- 日志查看:
journalctl -u nginx.service # 查看 Nginx 日志 journalctl -u nginx --since "10分钟前" # 时间范围过滤 journalctl -p err -u nginx # 仅显示错误级别日志
2.5 资源隔离与控制
- 限制服务资源(示例配置):
# 在 .service 文件中添加 MemoryMax=512M # 限制内存最大 512MB CPUQuota=50% # 限制 CPU 占用不超过 50%
- 沙盒化运行(增强安全性):
ProtectSystem=strict # 禁止修改系统文件 PrivateTmp=true # 服务使用独立临时目录
3. 服务管理实战
3.1 自定义服务文件
- 示例:编写一个 Python 脚本服务
创建/etc/systemd/system/myapp.service
:[Unit] Description=My Python App After=network.target # 确保网络就绪后启动[Service] ExecStart=/usr/bin/python3 /opt/myapp/main.py WorkingDirectory=/opt/myapp Restart=always # 任何原因退出都重启 User=www-data # 指定运行用户[Install] WantedBy=multi-user.target # 关联到标准多用户环境
- 生效步骤:
sudo systemctl daemon-reload # 重载配置 sudo systemctl start myapp # 启动服务
3.2 定时任务(替代 cron)
- 使用
systemd.timer
创建/etc/systemd/system/backup.timer
:[Unit] Description=Daily Backup Timer[Timer] OnCalendar=*-*-* 02:00:00 # 每天凌晨 2 点 Persistent=true # 错过时间后补执行[Install] WantedBy=timers.target
- 关联服务文件:创建同名
.service
文件(如backup.service
)定义具体任务。
4. 高级功能
4.1 分析系统启动性能
- 查看启动耗时:
systemd-analyze # 总启动时间 systemd-analyze blame # 各服务耗时排序 systemd-analyze critical-chain nginx # 服务的依赖链耗时
4.2 临时文件管理
- 替代
tmpfiles.d
,自动创建、清理临时目录:systemd-tmpfiles --create # 立即应用配置
4.3 Socket 激活
- 按需启动服务(如 SSH 仅在首次连接时启动):
# sshd.socket 文件 [Socket] ListenStream=22
5. 最佳实践
- 避免直接修改
/usr/lib/systemd/
自定义服务文件应放在/etc/systemd/system/
。 - 日志轮转
配置journald.conf
限制日志大小,防止磁盘占满。 - 谨慎使用
Restart=always
可能导致崩溃服务无限重启,消耗资源。
6. 常见问题排查
- 服务启动失败:
systemctl status <服务名> # 查看状态和错误提示 journalctl -xe # 查看最近日志详情
- 依赖冲突:
使用systemctl list-dependencies
分析依赖关系。
总结
systemd 不仅是服务管理器,更是现代 Linux 系统的“管家”,涵盖日志、挂载、定时任务等核心功能。掌握其用法可大幅提升运维效率,尤其在服务部署、资源监控和故障排查场景中。
附录:常用命令速查表
命令 | 说明 |
---|---|
systemctl list-unit-files --type=service | 列出所有可用服务 |
systemctl mask nginx | 禁止服务被手动或依赖启动 |
systemctl kill -s SIGTERM nginx | 强制终止服务进程 |
hostnamectl set-hostname myserver | 修改主机名(systemd 工具链) |