Linux systemd 详解一、什么是 systemdsystemd 是 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定时器替代 cron2. 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] DescriptionMy Custom Service Documentationhttp://example.com Afternetwork.target mysql.service Requiresmysql.service Beforenginx.service [Service] Typesimple Usermyuser Groupmygroup 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 Restarton-failure RestartSec5 [Install] WantedBymulti-user.target Aliasmyapp.service3. Service 类型详解Type说明simple默认值主进程直接启动forking程序会 fork 子进程传统 daemononeshot执行一次就退出常用于初始化脚本dbus需要 D-Bus 就绪后才启动notify启动完成后会发送通知五、实战案例案例1创建 Nginx 服务# 创建服务文件sudovim/etc/systemd/system/nginx.service[Unit] DescriptionThe NGINX HTTP and reverse proxy server Afternetwork.target remote-fs.target nss-lookup.target [Service] Typeforking 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 PrivateTmptrue [Install] WantedBymulti-user.target# 重新加载配置sudosystemctl daemon-reload# 启动服务sudosystemctl start nginx# 设置开机自启sudosystemctlenablenginx案例2Python Web 服务sudovim/etc/systemd/system/flaskapp.service[Unit] DescriptionFlask Web Application Afternetwork.target [Service] Userwww-data Groupwww-data WorkingDirectory/var/www/flaskapp EnvironmentPATH/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 Restartalways RestartSec10 [Install] WantedBymulti-user.target六、日志管理journalctlsystemd 自带日志系统 journald统一管理所有日志。常用 journalctl 命令# 查看所有日志journalctl# 查看指定服务日志journalctl -u nginx.service# 实时追踪日志journalctl -u nginx.service -f# 查看最近30分钟日志journalctl --since30 min ago# 查看今天日志journalctl --since today# 查看指定时间段journalctl --since2023-01-01--until2023-01-02# 查看内核日志journalctl -k# 查看本次启动后的日志journalctl -b七、定时任务Timersystemd Timer 可以替代传统的 cron 定时任务。示例每天凌晨备份数据库备份脚本/usr/local/bin/backup.sh#!/bin/bashtar-czf /backup/db_$(date\%Y\%m\%d).tar.gz /var/lib/mysqlService 文件/etc/systemd/system/backup.service[Unit] DescriptionDatabase backup [Service] Typeoneshot ExecStart/usr/local/bin/backup.sh UserrootTimer 文件/etc/systemd/system/backup.timer[Unit] DescriptionRun backup daily [Timer] OnCalendardaily Persistenttrue [Install] WantedBytimers.target启用定时器chmodx /usr/local/bin/backup.shsudosystemctl daemon-reloadsudosystemctlenablebackup.timersudosystemctl start backup.timer八、高级技巧1. 服务依赖关系[Unit] # 在什么之后启动 Afternetwork.target # 需要什么服务 Requiresmysql.service # 推荐依赖不影响启动 Wantsredis.service # 冲突关系 Conflictsapache2.service2. 资源限制[Service] # CPU 限制 CPUQuota50% # 内存限制 MemoryLimit1G # 打开文件数限制 LimitNOFILE65536 # 进程数限制 LimitNPROC10243. 环境变量[Service] # 单个设置 EnvironmentENVproduction EnvironmentPORT8080 # 从文件加载 EnvironmentFile/etc/myapp/env EnvironmentFile-/etc/myapp/env-local # 加-表示文件不存在也不报错九、故障排查常见问题排查步骤查看服务状态systemctl status service_name查看详细日志journalctl -u service_name -n50--no-pager检查 Unit 文件语法systemd-analyze verify /etc/systemd/system/xxx.service查看依赖问题systemctl list-dependencies service_name重新加载配置systemctl daemon-reload十、与传统 init 对比特性SysVinitsystemd启动方式串行并行服务依赖数字编号显式声明日志管理syslogjournald配置语法Shell 脚本声明式 INI动态管理不支持支持socket/D-Bus 激活资源控制不支持支持 cgroups总结systemd 作为现代 Linux 系统的核心组件提供了一套完整的系统和服务管理方案。掌握 systemd 不仅能帮助您更好地管理服务还能深入理解 Linux 系统的运作机制。从日常的服务启停到复杂的服务编排systemd 都能提供强大的支持。