Linux systemd 系统服务管理
一、前言对比
Windows 系统可通过services.msc打开服务管理器,管理软件启停、开机自启;
CentOS 7 及以上版本统一使用systemd作为系统初始化与服务管理器,是 Linux 下管理后台服务、开机自启的标准方案。
二、systemd 基础概念
1 systemd 优势
- 并行启动无依赖服务,大幅缩短开机时间;
- 按需激活:服务不会提前常驻,访问时才启动,节约资源;
- 统一管理系统所有资源(服务、挂载、定时任务等);
- 通过 CGroup 分组管理进程,杀死服务不会残留子进程。### 2 系统两大核心初始进程
- 用户空间一号进程:
systemd,PID = 1,系统所有进程始祖,负责系统初始化、服务管控; - 内核空间进程:
kthreadd,PID = 2,所有内核线程父进程。### 3 服务 vs 守护进程(daemon)区分 - 服务:业务层面统称,对外提供功能;
- 守护进程:后台长期运行、无终端依附的程序,是服务底层实现。
httpd 基础实操演示
# 安装web服务软件包[root@centos7~17:09:20]# yum install -y httpd# 启动httpd服务[root@centos7~17:09:33]# systemctl start httpd# 树形查看httpd所有守护进程[root@centos7~17:14:09]# ps -C httpd fPID TTY STAT TIME COMMAND3158? Ss0:00 /usr/sbin/httpd-DFOREGROUND3159? S0:00\_ /usr/sbin/httpd-DFOREGROUND3160? S0:00\_ /usr/sbin/httpd-DFOREGROUND3161? S0:00\_ /usr/sbin/httpd-DFOREGROUND3162? S0:00\_ /usr/sbin/httpd-DFOREGROUND3163? S0:00\_ /usr/sbin/httpd-DFOREGROUND主进程 PID=3158,其余为工作子进程,全部属于 httpd 服务的守护进程。
三、systemd 整体架构
- 核心后台程序:
systemd(PID = 1),负责调度、监控全部系统资源; - 用户交互工具:
systemctl,管理员操作服务的统一命令; - 管理最小单元:
Unit,所有系统资源都封装为 Unit 配置文件。## 四、systemd 十种 Unit 类型
| Unit类型 | 文件后缀 | 作用说明 |
| ---- | ---- | ---- |
| Service |.service| 系统后台服务(最常用,httpd/sshd) |
| Socket |.socket| 进程间通信套接字 |
| Target |.target| 模拟系统运行级别,服务分组 |
| Timer |.timer| 定时任务,替代 crontab |
| Device |.device| 内核识别硬件设备 |
| Mount |.mount| 文件系统挂载配置 |
| Automount |.automount| 文件系统自动挂载 |
| Swap |.swap| 交换分区配置 |
| Path |.path| 文件变动触发服务启动 |
| Slice |.slice| 进程资源限制分组 |
五、Unit 列表查看命令
1 查看当前已加载运行的所有 Unit
[root@centos7~17:16:11]# systemctl list-units输出字段说明:
- UNIT:单元名称
- LOAD:配置文件是否成功解析加载
- ACTIVE:单元整体激活状态
- SUB:细分运行状态
- DESCRIPTION:单元功能描述
2 指定类型过滤 unit(示例查看定时器 timer)
liuyifei@centos7 ~17:17:20$ systemctl list-units-ttimer UNIT LOAD ACTIVE SUB DESCRIPTION systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Director unbound-anchor.timer loaded active waiting daily update of the root trust anch LOAD=Reflects whether the unit definition was properly loaded. ACTIVE=The high-level unit activation state, i.e. generalization of SUB. SUB=The low-level unit activation state, values depend on unit type.2loadedunitslisted. Pass--allto see loaded but inactive units, too. To show all installed unit files use'systemctl list-unit-files'.3 查看所有 service 单元(包含运行/停止)
liuyifei@centos7 ~17:18:30$ systemctl list-units--typeservice--all4 查看系统全部unit文件(含未加载)
liuyifei@centos7 ~17:19:54 $ systemctl list-unit-files5 查看启动失败的异常服务
liuyifei@centos7 ~17:20:39$ systemctl--failed--typeservice六、查看单个服务详细状态
以 sshd 远程服务为例:
liuyifei@centos7 ~17:22:01$ systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded(/usr/lib/systemd/system/sshd.service;enabled;vendor preset: enabled)Active: active(running)since 三2026-07-2216:54:52 CST;27min ago Docs: man:sshd(8)man:sshd_config(5)Main PID:1197(sshd)Tasks:1CGroup: /system.slice/sshd.service └─1197 /usr/sbin/sshd-D7月2216:54:52 centos7.liuyifei.cloud systemd[1]: Starting OpenSSH server daemon...7月2216:54:52 centos7.liuyifei.cloud sshd[1197]: Server listening on0.0.0.0 po....7月2216:54:52 centos7.liuyifei.cloud sshd[1197]: Server listening on :: port22.7月2216:54:52 centos7.liuyifei.cloud systemd[1]: Started OpenSSH server daemon.7月2216:54:54 centos7.liuyifei.cloud sshd[1443]: Accepted passwordforliuyifei...27月2217:02:36 centos7.liuyifei.cloud sshd[2875]: Accepted passwordforliuyifei...27月2217:02:39 centos7.liuyifei.cloud sshd[2924]: Accepted passwordforroot fro...2 Hint: Some lines were ellipsized, use-lto showinfull.状态关键字释义
| 关键字 | 含义 |
|---|---|
| loaded | 单元配置文件解析完成 |
| active(running) | 服务正在运行 |
| active(exited) | 一次性任务执行完毕 |
| active(waiting) | 运行中,等待外部事件 |
| inactive | 服务已停止 |
| enabled | 开机自动启动 |
| disabled | 开机不启动 |
| static | 无法手动启动,依赖其他单元触发 |
七、systemctl 服务管理核心命令表
| 命令 | 功能描述 |
|---|---|
| systemctl status UNIT | 查看服务完整状态、PID、日志 |
| systemctl start UNIT | 立即启动服务 |
| systemctl stop UNIT | 停止运行中的服务 |
| systemctl restart UNIT | 重启服务(先 stop 再 start) |
| systemctl reload UNIT | 热重载配置,不重启主进程 |
| systemctl enable UNIT | 设置开机自启,加--now同步启动 |
| systemctl disable UNIT | 取消开机自启,加--now同步停止 |
| systemctl is-enabled UNIT | 查询是否开机自启 |
| systemctl mask UNIT | 彻底锁定服务,无法手动/开机启动 |
| systemctl unmask UNIT | 解除服务锁定,恢复可用 |
sshd 实操完整示例
# 停止 ssh 远程服务,现有连接会断开[root@centos7~17:28:26]# systemctl stop sshd# 测试 ssh 连接(连接失败)[root@centos7~17:29:10]# ssh liuyifei@10.1.8.10ssh: connect tohost10.1.8.10 port22: Connection refused# 启动 ssh 服务[root@centos7~17:30:25]# systemctl start sshd# 测试 ssh 连接(恢复正常)[root@centos7 ~]# ssh laoma@centos7 hostname# 重启服务[root@centos7~18:33:22]# ssh liuyifei@10.1.8.10liuyifei@10.1.8.10's password: Last login: Wed Jul2217:27:172026from10.1.8.1 liuyifei@centos7 ~18:33:34$# 修改配置后重载,不断开现有 ssh 会话[root@centos7~18:35:21]# systemctl reload sshd# 关闭开机自启[root@centos7~18:36:08]# systemctl disable sshdRemoved symlink /etc/systemd/system/multi-user.target.wants/sshd.service.[root@centos7~18:37:01]# systemctl is-enabled sshddisabled# 重启系统验证不自启[root@centos7~18:37:20]# reboot# 开启开机自启[root@centos7~18:42:30]# systemctl enable sshdCreated symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to /usr/lib/systemd/system/sshd.service.[root@centos7~18:43:42]# systemctl start sshd[root@centos7~18:44:18]# systemctl is-enabled sshdenabled# 彻底屏蔽ssh服务,无法start启动[root@centos7~18:48:13]# systemctl mask sshdCreated symlink from /etc/systemd/system/sshd.service to /dev/null.[root@centos7~18:51:49]# systemctl stop sshd[root@centos7~18:52:01]# systemctl start sshdFailed to start sshd.service: Unit is masked.# 解除屏蔽[root@centos7~18:52:25]# systemctl unmask sshdRemoved symlink /etc/systemd/system/sshd.service.八、service单元配置文件详解
配置文件优先级(从上至下优先级递减)
/etc/systemd/system/xxx.service:管理员自定义,优先级最高;/usr/lib/systemd/system/xxx.service:软件安装自带默认配置。
三大配置区块(以 sshd.service 为例)
[Unit] 区块:服务基础信息、依赖、启动顺序
[Unit] # 服务描述 Description=OpenSSH server daemon # 内置帮助文档 Documentation=man:sshd(8) man:sshd_config(5) # 必须在网络、密钥服务启动后再启动 sshd After=network.target sshd-keygen.service # 弱依赖:密钥服务失败不影响 sshd 运行 Wants=sshd-keygen.service[Service] 区块:运行规则、启停指令、重启策略
[Service] # 服务类型,启动后主动通知systemd就绪 Type=notify # 外部环境变量文件 EnvironmentFile=/etc/sysconfig # 前台启动命令 ExecStart=/usr/sbin/sshd -D $OPTIONS # 重载配置执行指令,发送HUP信号 ExecReload=/bin/kill -HUP $MAINPID # 仅杀死主进程,保留已建立连接 KillMode=process # 程序崩溃自动重启,手动停止不重启 Restart=on-failure # 崩溃后延迟42秒再重启,避免高频重启 RestartSec=42s[Install] 区块:定义开机启动目标
[Install] # 多用户命令行模式下自动启动 WantedBy=multi-user.target九、实战:自定义 study 系统服务
需求
编写循环脚本,每5秒写入时间日志到/var/log/study.log,注册为systemd 系统服务,开机自启。
步骤 1:编写全局执行脚本
[root@centos7~19:00:39]# vim /usr/local/bin/study#!/bin/bash# 无限循环whiletruedo# 获取当前时间DATE=$(date)# 追加写入日志echo"$DATE: I'M studying [ Linux ]">>/var/log/study.log# 延迟 5 秒sleep5done# 添加执行权限[root@centos7 ~19:00:51]# chmod +x /usr/local/bin/study步骤2:创建自定义服务单元文件
复制 sshd 配置作为模板,简化修改:
[root@centos7~19:00:42]# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/studyd.service[root@centos7~19:18:54]# vim /etc/systemd/system/studyd.service精简配置内容:
[Unit] Description=study server daemon [Service] ExecStart=/usr/local/bin/study [Install] WantedBy=multi-user.target步骤 3:重载 systemd 识别新配置
修改/新增 service 文件后必须执行,否则不生效
[root@centos7~19:26:26]# systemctl daemon-reload步骤 4:设置开机自启并立即启动服务
[root@centos7~19:33:14]# systemctl enable studyd --now步骤 5:查看 studyd 服务运行状态
[root@centos7~19:34:34]# systemctl status studyd● studyd.service - study server daemon Loaded: loaded(/etc/systemd/system/studyd.service;enabled;vendor preset: disabled)Active: active(running)since 三2026-07-2219:34:34 CST;25s ago Main PID:3956(study)Tasks:2CGroup: /system.slice/studyd.service ├─3956 /bin/bash /usr/local/bin/study └─3970sleep57月2219:34:34 centos7.liuyifei.cloud systemd[1]: Started study server daemon.步骤6:实时验证日志输出
liuyifei@centos7 ~19:34:00$tail-f/var/log/study.log2026年 07月22日 星期三19:35:14 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 19:35:19 CST: I'M studying[Linux]2026年 07月22日 星期三19:35:24 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 19:35:29 CST: I'M studying[Linux]2026年 07月22日 星期三19:35:34 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 19:35:39 CST: I'M studying[Linux]2026年 07月22日 星期三19:35:44 CST: I'M studying[Linux]日志每 5 秒持续新增,自定义服务部署完成。
十、总结
CentOS 7 使用 systemd 管理系统与后台服务,所有管理资源统一抽象为 Unit,.service 单元用来管控守护进程。
服务配置分为软件自带与管理员自定义两个目录,拥有不同优先级。依靠 systemctl 工具可以完成服务启停、自启管理、配置重载等运维操作。
我们能够自行编写业务脚本,创建对应的 service 配置文件,将普通脚本注册为系统服务,实现开机自启、标准化托管。同时需要区分修改配置文件和修改业务脚本对应的不同生效方式,理解 disable 与 mask 的管控差异。