CentOS 7 服务管理
CentOS 7 是 Red Hat Enterprise Linux(RHEL)的开源版本,广泛应用于服务器和云计算环境中,其服务管理主要依赖于 systemd,这是一个初始化系统和服务管理器,取代了旧版 SysVinit,Systemd 提供了更高效和灵活的服务管理功能,支持并发启动和依赖关系处理。

systemctl 命令
1. 常用命令
命令 | 描述 |
systemctl start | 启动指定的 unit |
systemctl stop | 停止指定的 unit |
systemctl restart | 重启指定的 unit |
systemctl enable | 设置开机时自动启动该 unit |
systemctl disable | 取消开机时自动启动该 unit |
systemctl status | 查看 unit 的状态 |
systemctl isenabled | 检查 unit 是否设置为开机启动 |
systemctl listunits type=service | 列出所有已启动的服务单元 |
2. 示例
- 启动 httpd 服务
- systemctl start httpd.service
- 停止 httpd 服务
- systemctl stop httpd.service
- 重启 httpd 服务
- systemctl restart httpd.service
- 开机时启用 httpd 服务
- systemctl enable httpd.service
- 查看 httpd 服务状态
- systemctl status httpd.service
- 查看当前系统中所有运行的服务单元
- systemctl listunits type=service
Unit 类型
Systemd 中的 Unit 是各种资源的基本抽象单位,包括服务单元(Service units)、目标单元(Target units)、设备单元(Device units)等,以下是一些常见的 Unit 类型:
1. Service unit
定义系统服务,如httpd.service
。
2. Target unit

定义多个 Unit 构成的组,如multiuser.target
。
3. Device unit
代表硬件设备,如sda.device
。
4. Mount unit
文件系统的挂载点,如/home.mount
。
5. Automount unit

自动挂载点,如/media/cdrom.automount
。
6. Path unit
文件或路径,如/etc/rc.local.path
。
7. Scope unit
不由 Systemd 启动的外部进程,如myscope.scope
。
8. Socket unit
进程间通信的 socket,如syslog.socket
。
9. Slice unit
进程组,如slice1.slice
。
10. Snapshot unit
Systemd 快照,可以切回某个快照,如snapshot.img
。
11. Swap unit
swap 文件,如swapfile.swap
。
12. Timer unit
定时器,如timer.timer
。
单个 Unit 状态查看
使用systemctl
命令可以查看单个 Unit 的状态:
- 查看 httpd 服务的状态
- systemctl status httpd.service
输出示例:
- ● httpd.service The Apache HTTP Server
- Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
- Active: active (running) since Mon 20230828 10:00:00 CDT; 1h 30min ago
- ...
- Main PID: 1234 (httpd)
- Memory: 20.0M
- CGroup: /system.slice/httpd.service
- ├─1234 /usr/sbin/httpd DFOREGROUND
- ├─1235 /usr/sbin/httpd DFOREGROUND
- └─1236 /usr/sbin/httpd DFOREGROUND
当前系统的所有 Unit 状态
使用以下命令可以列出当前系统中所有 Unit 的状态:
- 列出所有正在运行的 Unit
- systemctl listunits
- 列出所有 Unit,包括没有找到配置文件的或者启动失败的
- systemctl listunits all
- 列出所有没有运行的 Unit
- systemctl listunits all state=inactive
依赖关系
Systemd 支持服务的依赖关系管理,可以使用以下命令查看和管理依赖关系:
- 列出某个 unit 的依赖关系
- systemctl listdependencies <unit>
- 展开显示依赖关系树
- systemctl listdependencies all <unit>
- 反向查询依赖关系,即哪些 unit 依赖于此 unit
- systemctl listdependencies reverse <unit>
常见问题及解决方案(FAQs)
Q1: 如何查看某个服务是否在开机时自动启动?
A1: 使用systemctl isenabled
命令可以检查某个服务是否在开机时自动启动,要检查 Httpd 服务是否在开机时自动启动,可以执行以下命令:
- systemctl isenabled httpd.service
输出enabled
表示该服务在开机时会自动启动,输出disabled
表示不会自动启动。
Q2: 如何自定义一个 systemd 服务单元文件?
A2: 自定义一个 systemd 服务单元文件需要编辑一个 .service 文件并放置在/usr/lib/systemd/system
目录下,以下是一个创建 Tomcat 服务单元文件的示例:
- 创建 Tomcat 服务单元文件
- vim /usr/lib/systemd/system/tomcat.service
在该文件中添加如下内容:
- [Unit]
- Description=Java Tomcat Project
- After=network.target java.service
- [Service]
- Type=forking
- User=tomcatuser
- Group=tomcatuser
- PIDFile=/var/run/tomcat8.pid
- ExecStart=/usr/local/tomcat/bin/startup.sh
- ExecStop=/usr/local/tomcat/bin/shutdown.sh
- PrivateTmp=true
- Restart=onfailure
- RestartSec=5s
- [Install]
- WantedBy=multiuser.target
保存文件后,加载新的单元文件并设置开机自启动:
- systemctl daemonreload
- systemctl enable tomcat.service
然后你可以启动、停止或查看 Tomcat 服务的状态:
- systemctl start tomcat.service
- systemctl stop tomcat.service
- systemctl status tomcat.service