当前位置: 首页 > news >正文

Linux systemd 服务管理器详解

Linux systemd 详解

一、什么是 systemd?

systemd 是 Linux 系统的初始化系统服务管理器,是目前大多数主流 Linux 发行版(如 CentOS/RHEL 7+、Ubuntu 15+、Debian 8+)默认使用的 init 程序。

核心特点

  • 并行启动:相比传统的 SysVinit(串行启动),systemd 支持并行启动服务,大幅提升启动速度
  • 按需启动:不立即启动所有服务,只在需要时才启动
  • 依赖管理:明确定义服务之间的依赖关系
  • 统一管理:不仅管理系统服务,还管理挂载点、套接字、设备等

二、核心概念

1. Unit(单元)

systemd 中所有资源都被称为 Unit,主要类型包括:

类型扩展名作用
Service.service系统服务
Socket.socket进程间通信套接字
Target.target一组 Unit 的集合(类似运行级别)
Mount.mount文件系统挂载点
Device.device内核识别的设备
Timer.timer定时器(替代 cron)

2. Target(目标)

替代传统的运行级别(runlevel):

运行级别Target描述
0runlevel0.target / poweroff.target关机
1runlevel1.target / rescue.target单用户模式
2-4runlevel2-4.target / multi-user.target多用户非图形界面
5runlevel5.target / graphical.target多用户图形界面
6runlevel6.target / reboot.target重启

三、常用命令

服务管理

# 启动服务systemctl start service_name# 停止服务systemctl stop service_name# 重启服务systemctl restart service_name# 重新加载配置(不中断服务)systemctl reload service_name# 查看服务状态systemctl status service_name# 启用开机自启systemctlenableservice_name# 禁用开机自启systemctl disable service_name# 检查是否开机自启systemctl is-enabled service_name

系统状态查看

# 列出所有运行中服务systemctl list-units# 列出所有服务(包括未启动)systemctl list-unit-files# 查看系统启动耗时systemd-analyze# 查看每个服务启动耗时systemd-analyze blame# 查看依赖关系systemd-analyze critical-chain

系统控制

# 重启系统systemctlreboot# 关机systemctl poweroff# 进入救援模式systemctl rescue# 挂起systemctlsuspend

四、编写 Service Unit 文件

1. 文件位置

  • 系统服务:/usr/lib/systemd/system/
  • 用户自定义:/etc/systemd/system/(优先级更高)

2. Unit 文件结构

[Unit] Description=My Custom Service Documentation=http://example.com After=network.target mysql.service Requires=mysql.service Before=nginx.service [Service] Type=simple User=myuser Group=mygroup WorkingDirectory=/opt/myapp EnvironmentFile=/etc/myapp/config ExecStart=/usr/bin/python3 /opt/myapp/app.py ExecReload=/bin/kill -HUP $MAINPID ExecStop=/bin/kill -TERM $MAINPID Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target Alias=myapp.service

3. Service 类型详解

Type说明
simple默认值,主进程直接启动
forking程序会 fork 子进程(传统 daemon)
oneshot执行一次就退出,常用于初始化脚本
dbus需要 D-Bus 就绪后才启动
notify启动完成后会发送通知

五、实战案例

案例1:创建 Nginx 服务

# 创建服务文件sudovim/etc/systemd/system/nginx.service
[Unit] Description=The NGINX HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/usr/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
# 重新加载配置sudosystemctl daemon-reload# 启动服务sudosystemctl start nginx# 设置开机自启sudosystemctlenablenginx

案例2:Python Web 服务

sudovim/etc/systemd/system/flaskapp.service
[Unit] Description=Flask Web Application After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/flaskapp Environment="PATH=/var/www/flaskapp/venv/bin" EnvironmentFile=/etc/flaskapp/env ExecStart=/var/www/flaskapp/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app Restart=always RestartSec=10 [Install] WantedBy=multi-user.target

六、日志管理(journalctl)

systemd 自带日志系统 journald,统一管理所有日志。

常用 journalctl 命令

# 查看所有日志journalctl# 查看指定服务日志journalctl -u nginx.service# 实时追踪日志journalctl -u nginx.service -f# 查看最近30分钟日志journalctl --since"30 min ago"# 查看今天日志journalctl --since today# 查看指定时间段journalctl --since"2023-01-01"--until"2023-01-02"# 查看内核日志journalctl -k# 查看本次启动后的日志journalctl -b

七、定时任务(Timer)

systemd Timer 可以替代传统的 cron 定时任务。

示例:每天凌晨备份数据库

备份脚本/usr/local/bin/backup.sh

#!/bin/bashtar-czf /backup/db_$(date+\%Y\%m\%d).tar.gz /var/lib/mysql

Service 文件/etc/systemd/system/backup.service

[Unit] Description=Database backup [Service] Type=oneshot ExecStart=/usr/local/bin/backup.sh User=root

Timer 文件/etc/systemd/system/backup.timer

[Unit] Description=Run backup daily [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target

启用定时器

chmod+x /usr/local/bin/backup.shsudosystemctl daemon-reloadsudosystemctlenablebackup.timersudosystemctl start backup.timer

八、高级技巧

1. 服务依赖关系

[Unit] # 在什么之后启动 After=network.target # 需要什么服务 Requires=mysql.service # 推荐依赖(不影响启动) Wants=redis.service # 冲突关系 Conflicts=apache2.service

2. 资源限制

[Service] # CPU 限制 CPUQuota=50% # 内存限制 MemoryLimit=1G # 打开文件数限制 LimitNOFILE=65536 # 进程数限制 LimitNPROC=1024

3. 环境变量

[Service] # 单个设置 Environment=ENV=production Environment=PORT=8080 # 从文件加载 EnvironmentFile=/etc/myapp/env EnvironmentFile=-/etc/myapp/env-local # 加-表示文件不存在也不报错

九、故障排查

常见问题排查步骤

  1. 查看服务状态
systemctl status service_name
  1. 查看详细日志
journalctl -u service_name -n50--no-pager
  1. 检查 Unit 文件语法
systemd-analyze verify /etc/systemd/system/xxx.service
  1. 查看依赖问题
systemctl list-dependencies service_name
  1. 重新加载配置
systemctl daemon-reload

十、与传统 init 对比

特性SysVinitsystemd
启动方式串行并行
服务依赖数字编号显式声明
日志管理syslogjournald
配置语法Shell 脚本声明式 INI
动态管理不支持支持(socket/D-Bus 激活)
资源控制不支持支持 cgroups

总结

systemd 作为现代 Linux 系统的核心组件,提供了一套完整的系统和服务管理方案。掌握 systemd 不仅能帮助您更好地管理服务,还能深入理解 Linux 系统的运作机制。从日常的服务启停,到复杂的服务编排,systemd 都能提供强大的支持。

http://www.jsqmd.com/news/390266/

相关文章:

  • 《P3648 [APIO2014] 序列分割》
  • Nodejs+vue3框架的仓储管理系统 仓库进销存管理系统
  • DDoS攻击深度解析:原理、类型、防御与案例
  • nodejs+vue3基于微信小程序的技术编程语言学习指南应用
  • Nodejs+vue3居民小区物业管理系统
  • nodejs+vue3基于微信小程序的宠物之家健康用品销售系统 宠物用品商城系统
  • Synology NAS 域账户验证失败
  • 大数据与材料科学:高通量计算数据分析
  • 微信小应用页面配置详解
  • AI架构师实战:分布式训练系统的故障恢复机制
  • 从入门到精通:提示工程加密解决方案的系统学习路径
  • 科研数据AI分析工具,让AI应用架构师如鱼得水
  • 2024年新算法】CPO-LSSVM多输出回归预测的Matlab代码
  • 揭秘大数据领域 ETL 的核心原理
  • 最优化: 建模、算法与理论 习题1 #5解答
  • 提示词 大模型实战 2-4 提示词聚合网站
  • 纯粹武力批判:哲学家四象限梗图笑点解析
  • 《海阔天空》MV制作教程:DeepSeek+百度AI+剪映,致敬经典
  • fprinted
  • AD9361 FPGA驱动,纯verilog驱动,lvds接口,没有使用任何依赖库和ip核,方...
  • oeasy Python 115 列表弹栈用pop删除指定索引
  • 【深度硬核】OpenClaw 避坑指南:是全自动 Agent 还是带锁的“数字盲人”?
  • 除夕夜王炸!阿里开源千问3.5,性能暴打Gemini 3 Pro?打工人0.8元/百万token真香!
  • 吕良伟首次执麦主持 大年初一CCTV-4“四海同春”大联欢见
  • 【一文了解】网络请求 - 详解
  • Nodejs+vue3的汽车4S店车辆维修管理系统开题
  • 祝大家新年快乐
  • Nodejs+vue3的电子产品销售商城系统
  • spring事务传播机制NESTED
  • Nodejs+vue3的旅游微信小程序的 线路 酒店 机票