简体中文 繁體中文 English Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français Japanese

站内搜索

搜索
AI 风月

活动公告

03-01 22:34
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

CentOS服务启动与停止完全指南 掌握systemctl命令轻松管理系统服务 提升服务器运维效率

3万

主题

602

科技点

3万

积分

白金月票

碾压王

积分
32704

立华奏

发表于 2025-9-20 13:10:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在CentOS服务器管理中,服务管理是日常运维工作的核心部分。无论是Web服务器、数据库服务还是其他关键应用,都需要通过系统服务的形式运行。随着CentOS 7及以后版本采用systemd作为初始化系统,systemctl命令成为了管理这些服务的主要工具。

systemctl是systemd系统和服务管理器的命令行接口,它提供了强大的功能来控制系统服务、查看系统状态和管理系统进程。掌握systemctl命令不仅能帮助管理员高效地管理服务,还能提升服务器的运维效率和稳定性。

本文将全面介绍如何使用systemctl命令在CentOS系统中启动、停止和管理各种服务,从基础操作到高级技巧,帮助您成为服务管理的专家。

systemctl基础

什么是systemd和systemctl

systemd是Linux系统的系统和服务管理器,它取代了传统的SysV初始化系统。systemd的设计目标是提供更快的启动速度、更好的并行处理能力和更强大的依赖关系管理。

systemctl是与systemd交互的主要命令行工具,通过它可以控制systemd管理的系统和服务。systemctl命令提供了丰富的选项和子命令,可以满足各种服务管理需求。

systemctl基本语法

systemctl命令的基本语法如下:
  1. systemctl [OPTIONS] COMMAND [UNIT]
复制代码

其中:

• OPTIONS:可选参数,用于修改命令的行为
• COMMAND:要执行的操作,如start、stop、status等
• UNIT:目标服务单元,如httpd.service、nginx.service等

服务单元文件

在systemd中,每个服务都由一个单元文件(unit file)来定义。这些文件通常位于以下目录之一:

• /usr/lib/systemd/system/:系统安装的软件包提供的服务单元
• /etc/systemd/system/:系统管理员创建或修改的服务单元

一个基本的服务单元文件示例(/etc/systemd/system/example.service):
  1. [Unit]
  2. Description=Example Service
  3. After=network.target
  4. [Service]
  5. Type=simple
  6. ExecStart=/usr/local/bin/example-service
  7. Restart=on-failure
  8. [Install]
  9. WantedBy=multi-user.target
复制代码

这个文件定义了一个名为”example.service”的服务,包括描述、依赖关系、启动命令和重启策略等信息。

服务管理基本操作

启动服务

要启动一个服务,使用start子命令:
  1. sudo systemctl start httpd.service
复制代码

或者简写为:
  1. sudo systemctl start httpd
复制代码

.service后缀通常可以省略,systemctl会自动补全。

示例:启动Apache HTTP服务器
  1. # 检查服务状态
  2. sudo systemctl status httpd
  3. # 启动服务
  4. sudo systemctl start httpd
  5. # 再次检查服务状态,确认服务已启动
  6. sudo systemctl status httpd
复制代码

停止服务

要停止一个运行中的服务,使用stop子命令:
  1. sudo systemctl stop httpd.service
复制代码

示例:停止Apache HTTP服务器
  1. # 检查服务状态
  2. sudo systemctl status httpd
  3. # 停止服务
  4. sudo systemctl stop httpd
  5. # 再次检查服务状态,确认服务已停止
  6. sudo systemctl status httpd
复制代码

重启服务

重启服务会先停止服务,然后再启动它。使用restart子命令:
  1. sudo systemctl restart httpd.service
复制代码

示例:重启Apache HTTP服务器
  1. # 检查服务状态
  2. sudo systemctl status httpd
  3. # 重启服务
  4. sudo systemctl restart httpd
  5. # 再次检查服务状态,确认服务已重启
  6. sudo systemctl status httpd
复制代码

重载服务

有些服务支持重载配置而不中断服务。使用reload子命令:
  1. sudo systemctl reload httpd.service
复制代码

如果不确定服务是否支持重载,可以使用reload-or-restart命令,它会尝试重载服务,如果不支持则重启服务:
  1. sudo systemctl reload-or-restart httpd.service
复制代码

示例:重载Nginx配置
  1. # 修改Nginx配置文件
  2. sudo vi /etc/nginx/nginx.conf
  3. # 重载Nginx配置
  4. sudo systemctl reload nginx
  5. # 检查Nginx状态
  6. sudo systemctl status nginx
复制代码

服务状态查询与监控

查看服务状态

要查看服务的当前状态,使用status子命令:
  1. sudo systemctl status httpd.service
复制代码

输出示例:
  1. ● httpd.service - The Apache HTTP Server
  2.    Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  3.    Active: active (running) since Thu 2023-05-25 10:30:15 CST; 2 days ago
  4.      Docs: man:httpd.service(8)
  5. Main PID: 1234 (httpd)
  6.    Status: "Total requests: 50; Idle/Busy workers 100/0;Requests/sec: 0.001; Bytes served/sec:  1 B/sec"
  7.     Tasks: 55 (limit: 1137)
  8.    Memory: 25.0M
  9.    CGroup: /system.slice/httpd.service
  10.            ├─1234 /usr/sbin/httpd -DFOREGROUND
  11.            ├─1235 /usr/sbin/httpd -DFOREGROUND
  12.            ├─1236 /usr/sbin/httpd -DFOREGROUND
  13.            └─1237 /usr/sbin/httpd -DFOREGROUND
复制代码

这个输出显示了服务的详细信息,包括:

• 服务描述
• 是否已加载
• 当前状态(active/inactive)
• 运行时间
• 主进程ID
• 资源使用情况
• 相关进程

检查服务是否运行

如果只需要知道服务是否在运行,而不需要详细信息,可以使用is-active子命令:
  1. sudo systemctl is-active httpd.service
复制代码

输出会很简单,如active或inactive。

查看服务日志

systemd提供了journalctl命令来查看服务日志。要查看特定服务的日志,使用-u选项:
  1. sudo journalctl -u httpd.service
复制代码

要实时跟踪日志输出(类似于tail -f),添加-f选项:
  1. sudo journalctl -u httpd.service -f
复制代码

要限制显示的日志条目数量,使用-n选项:
  1. sudo journalctl -u httpd.service -n 50
复制代码

要查看特定时间范围内的日志,使用--since和--until选项:
  1. sudo journalctl -u httpd.service --since "2023-05-25 10:00:00" --until "2023-05-25 11:00:00"
复制代码

列出所有服务

要列出所有已加载的服务单元,使用list-units子命令并过滤服务类型:
  1. sudo systemctl list-units --type=service
复制代码

要列出所有服务单元(包括未加载的),添加--all选项:
  1. sudo systemctl list-units --type=service --all
复制代码

服务开机自启动管理

启用服务开机自启动

要让服务在系统启动时自动启动,使用enable子命令:
  1. sudo systemctl enable httpd.service
复制代码

这个命令会创建一个符号链接,将服务单元文件连接到适当的.target.wants目录中。

示例:启用Apache HTTP服务器开机自启动
  1. # 启用服务开机自启动
  2. sudo systemctl enable httpd
  3. # 验证服务是否已启用
  4. sudo systemctl is-enabled httpd
复制代码

禁用服务开机自启动

要禁止服务在系统启动时自动启动,使用disable子命令:
  1. sudo systemctl disable httpd.service
复制代码

这个命令会删除之前创建的符号链接。

示例:禁用Apache HTTP服务器开机自启动
  1. # 禁用服务开机自启动
  2. sudo systemctl disable httpd
  3. # 验证服务是否已禁用
  4. sudo systemctl is-enabled httpd
复制代码

检查服务是否已启用开机自启动

要检查服务是否已设置为开机自启动,使用is-enabled子命令:
  1. sudo systemctl is-enabled httpd.service
复制代码

输出可能是:

• enabled:服务已启用开机自启动
• disabled:服务已禁用开机自启动
• static:服务不能直接启用,但可能被其他服务依赖而启动
• masked:服务已被掩码,无法启动

查看所有已启用的服务

要查看所有已启用开机自启动的服务,使用以下命令:
  1. sudo systemctl list-unit-files --type=service --state=enabled
复制代码

高级systemctl功能

掩码服务

掩码(mask)是一种更强烈的禁用方式,它会将服务单元文件链接到/dev/null,使服务无法启动。要掩码一个服务:
  1. sudo systemctl mask httpd.service
复制代码

要取消掩码:
  1. sudo systemctl unmask httpd.service
复制代码

掩码服务通常用于防止管理员意外启动可能导致冲突的服务,或者在某些安全场景下完全禁用某个服务。

示例:掩码和取消掩码Apache HTTP服务器
  1. # 掩码服务
  2. sudo systemctl mask httpd
  3. # 尝试启动服务(会失败)
  4. sudo systemctl start httpd
  5. # 取消掩码服务
  6. sudo systemctl unmask httpd
  7. # 再次尝试启动服务(会成功)
  8. sudo systemctl start httpd
复制代码

查看服务依赖关系

systemd管理服务之间的依赖关系,确保服务按正确的顺序启动。要查看服务的依赖关系,使用list-dependencies子命令:
  1. sudo systemctl list-dependencies httpd.service
复制代码

要递归显示所有依赖关系,添加--all选项:
  1. sudo systemctl list-dependencies httpd.service --all
复制代码

示例:查看Apache HTTP服务器的依赖关系
  1. # 查看直接依赖关系
  2. sudo systemctl list-dependencies httpd
  3. # 查看所有依赖关系(递归)
  4. sudo systemctl list-dependencies httpd --all
复制代码

修改服务配置

有时我们需要修改服务的默认配置,这可以通过创建覆盖文件来实现,而不是直接修改原始的服务单元文件。

1. 首先,创建一个覆盖目录:
  1. sudo systemctl edit httpd.service
复制代码

这会创建一个目录/etc/systemd/system/httpd.service.d,并在其中打开一个编辑器,让你创建覆盖文件。

1. 在编辑器中添加要覆盖的配置,例如:
  1. [Service]
  2. Restart=always
  3. RestartSec=10s
复制代码

1. 保存并退出编辑器,systemd会自动创建一个override.conf文件。
2. 重新加载systemd配置:

保存并退出编辑器,systemd会自动创建一个override.conf文件。

重新加载systemd配置:
  1. sudo systemctl daemon-reload
复制代码

1. 重启服务以应用新配置:
  1. sudo systemctl restart httpd.service
复制代码

创建自定义服务

要创建一个自定义服务,需要创建一个服务单元文件。以下是一个创建简单自定义服务的示例:

1. 创建服务单元文件:
  1. sudo vi /etc/systemd/system/myapp.service
复制代码

1. 添加以下内容:
  1. [Unit]
  2. Description=My Custom Application
  3. After=network.target
  4. [Service]
  5. Type=simple
  6. User=myuser
  7. WorkingDirectory=/opt/myapp
  8. ExecStart=/opt/myapp/myapp
  9. Restart=on-failure
  10. RestartSec=5s
  11. [Install]
  12. WantedBy=multi-user.target
复制代码

1. 重新加载systemd配置:
  1. sudo systemctl daemon-reload
复制代码

1. 启动并启用服务:
  1. sudo systemctl start myapp.service
  2. sudo systemctl enable myapp.service
复制代码

1. 检查服务状态:
  1. sudo systemctl status myapp.service
复制代码

实战案例

管理Web服务器

Apache是CentOS上最常用的Web服务器之一。以下是如何使用systemctl管理Apache服务:
  1. # 安装Apache
  2. sudo yum install httpd
  3. # 启动Apache服务
  4. sudo systemctl start httpd
  5. # 设置Apache开机自启动
  6. sudo systemctl enable httpd
  7. # 检查Apache服务状态
  8. sudo systemctl status httpd
  9. # 修改Apache配置后重载服务
  10. sudo vi /etc/httpd/conf/httpd.conf
  11. sudo systemctl reload httpd
  12. # 停止Apache服务
  13. sudo systemctl stop httpd
复制代码

Nginx是另一个流行的Web服务器,以其高性能和低资源消耗而闻名:
  1. # 安装EPEL仓库(如果尚未安装)
  2. sudo yum install epel-release
  3. # 安装Nginx
  4. sudo yum install nginx
  5. # 启动Nginx服务
  6. sudo systemctl start nginx
  7. # 设置Nginx开机自启动
  8. sudo systemctl enable nginx
  9. # 检查Nginx服务状态
  10. sudo systemctl status nginx
  11. # 修改Nginx配置后重载服务
  12. sudo vi /etc/nginx/nginx.conf
  13. sudo systemctl reload nginx
  14. # 停止Nginx服务
  15. sudo systemctl stop nginx
复制代码

管理数据库服务

MariaDB是MySQL的一个分支,是CentOS上的默认数据库服务器:
  1. # 安装MariaDB
  2. sudo yum install mariadb-server
  3. # 启动MariaDB服务
  4. sudo systemctl start mariadb
  5. # 设置MariaDB开机自启动
  6. sudo systemctl enable mariadb
  7. # 检查MariaDB服务状态
  8. sudo systemctl status mariadb
  9. # 安全初始化MariaDB
  10. sudo mysql_secure_installation
  11. # 重启MariaDB服务
  12. sudo systemctl restart mariadb
  13. # 停止MariaDB服务
  14. sudo systemctl stop mariadb
复制代码

PostgreSQL是一个功能强大的开源对象关系数据库系统:
  1. # 安装PostgreSQL
  2. sudo yum install postgresql-server
  3. # 初始化数据库
  4. sudo postgresql-setup initdb
  5. # 启动PostgreSQL服务
  6. sudo systemctl start postgresql
  7. # 设置PostgreSQL开机自启动
  8. sudo systemctl enable postgresql
  9. # 检查PostgreSQL服务状态
  10. sudo systemctl status postgresql
  11. # 重启PostgreSQL服务
  12. sudo systemctl restart postgresql
  13. # 停止PostgreSQL服务
  14. sudo systemctl stop postgresql
复制代码

管理防火墙服务

Firewalld是CentOS上的默认防火墙管理工具:
  1. # 启动Firewalld服务
  2. sudo systemctl start firewalld
  3. # 设置Firewalld开机自启动
  4. sudo systemctl enable firewalld
  5. # 检查Firewalld服务状态
  6. sudo systemctl status firewalld
  7. # 添加防火墙规则(例如开放HTTP端口)
  8. sudo firewall-cmd --permanent --add-service=http
  9. sudo firewall-cmd --reload
  10. # 重启Firewalld服务
  11. sudo systemctl restart firewalld
  12. # 停止Firewalld服务
  13. sudo systemctl stop firewalld
复制代码

管理Docker服务

Docker是一个流行的容器化平台:
  1. # 安装Docker
  2. sudo yum install docker
  3. # 启动Docker服务
  4. sudo systemctl start docker
  5. # 设置Docker开机自启动
  6. sudo systemctl enable docker
  7. # 检查Docker服务状态
  8. sudo systemctl status docker
  9. # 重启Docker服务
  10. sudo systemctl restart docker
  11. # 停止Docker服务
  12. sudo systemctl stop docker
复制代码

故障排除

服务无法启动

当服务无法启动时,首先检查服务状态:
  1. sudo systemctl status httpd.service
复制代码

如果状态显示为”failed”,查看详细日志:
  1. sudo journalctl -u httpd.service -n 50
复制代码

常见原因和解决方法:

1. 配置文件错误:检查服务的配置文件语法是否正确
2. 端口冲突:使用netstat或ss命令检查端口是否被占用sudo ss -tulnp | grep :80
3. 权限问题:确保服务有权限访问所需的文件和目录
4. 依赖服务未启动:检查并启动所有依赖服务
  1. sudo ss -tulnp | grep :80
复制代码

服务启动后自动停止

如果服务启动后很快自动停止,可能是以下原因:

1. 服务崩溃:查看服务日志了解崩溃原因sudo journalctl -u httpd.service -f
2. 资源限制:检查系统资源是否足够free -h
df -h
3. 配置问题:检查服务配置,特别是内存和进程限制
  1. sudo journalctl -u httpd.service -f
复制代码
  1. free -h
  2. df -h
复制代码

服务开机自启动不工作

如果服务没有在系统启动时自动启动,检查以下内容:

1. 服务是否已启用:sudo systemctl is-enabled httpd.service
2. 目标文件是否正确链接:ls -l /etc/systemd/system/multi-user.target.wants/httpd.service
3. 服务依赖是否满足:sudo systemctl list-dependencies httpd.service
4. 检查系统启动日志:sudo journalctl -b
  1. sudo systemctl is-enabled httpd.service
复制代码
  1. ls -l /etc/systemd/system/multi-user.target.wants/httpd.service
复制代码
  1. sudo systemctl list-dependencies httpd.service
复制代码
  1. sudo journalctl -b
复制代码

systemctl命令无响应

如果systemctl命令无响应或报错,尝试以下步骤:

1. 检查systemd状态:sudo systemctl status
2. 重新加载systemd配置:sudo systemctl daemon-reload
3. 重启systemd服务:sudo systemctl restart systemd
4. 检查系统日志:sudo journalctl -xn
  1. sudo systemctl status
复制代码
  1. sudo systemctl daemon-reload
复制代码
  1. sudo systemctl restart systemd
复制代码
  1. sudo journalctl -xn
复制代码

最佳实践

服务管理最佳实践

1. 使用标准命名约定:服务单元文件应使用标准命名约定,如httpd.service、nginx.service等。
2. 避免直接修改系统提供的服务单元文件:如果要修改服务配置,使用覆盖文件而不是直接修改原始文件。
3.
  1. 合理设置重启策略:对于关键服务,设置适当的重启策略:[Service]
  2. Restart=on-failure
  3. RestartSec=5s
复制代码
4.
  1. 使用适当的资源限制:为服务设置适当的资源限制,防止单个服务耗尽系统资源:[Service]
  2. MemoryLimit=512M
  3. CPUQuota=50%
复制代码
5. 定期检查服务状态:使用监控工具定期检查关键服务状态,或设置自动报警。

使用标准命名约定:服务单元文件应使用标准命名约定,如httpd.service、nginx.service等。

避免直接修改系统提供的服务单元文件:如果要修改服务配置,使用覆盖文件而不是直接修改原始文件。

合理设置重启策略:对于关键服务,设置适当的重启策略:
  1. [Service]
  2. Restart=on-failure
  3. RestartSec=5s
复制代码

使用适当的资源限制:为服务设置适当的资源限制,防止单个服务耗尽系统资源:
  1. [Service]
  2. MemoryLimit=512M
  3. CPUQuota=50%
复制代码

定期检查服务状态:使用监控工具定期检查关键服务状态,或设置自动报警。

自动化服务管理

1.
  1. 使用脚本批量管理服务:
  2. “`bash
  3. #!/bin/bash批量启动多个服务services=(“httpd” “mariadb” “nginx”)
复制代码

使用脚本批量管理服务:
“`bash
#!/bin/bash

services=(“httpd” “mariadb” “nginx”)

for service in “${services[@]}”; do
  1. echo "Starting $service..."
  2.    sudo systemctl start $service
  3.    sudo systemctl enable $service
复制代码

done
  1. 2. **使用Cron定时检查服务状态**:
  2.    ```bash
  3.    # 编辑crontab
  4.    crontab -e
  5.    
  6.    # 添加以下行,每30分钟检查一次服务状态
  7.    */30 * * * * /usr/local/bin/check_services.sh
复制代码

check_services.sh脚本示例:
  1. #!/bin/bash
  2.    services=("httpd" "mariadb" "nginx")
  3.    
  4.    for service in "${services[@]}"; do
  5.        if ! systemctl is-active --quiet $service; then
  6.            echo "$service is not running, attempting to restart..." | logger -t service_check
  7.            systemctl restart $service
  8.        fi
  9.    done
复制代码

1.
  1. 使用Ansible等配置管理工具:对于大规模服务器管理,使用Ansible等工具可以更高效地管理服务:
  2. “`yaml
  3. —hosts: webservers
  4. tasks:- name: Ensure Apache is runningsystemd:
  5.    name: httpd
  6.    state: started
  7.    enabled: yes”`
复制代码
2.
  1. hosts: webservers
  2. tasks:- name: Ensure Apache is runningsystemd:
  3.    name: httpd
  4.    state: started
  5.    enabled: yes
复制代码

  1. hosts: webservers
  2. tasks:- name: Ensure Apache is runningsystemd:
  3.    name: httpd
  4.    state: started
  5.    enabled: yes
复制代码
  1. - name: Ensure Apache is running
复制代码

安全最佳实践

1.
  1. 最小权限原则:以最低必要权限运行服务,避免使用root用户运行服务:[Service]
  2. User=myuser
  3. Group=mygroup
复制代码
2. 限制服务访问:使用防火墙规则限制服务的网络访问:sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
3. 定期更新服务:保持服务软件更新,修复已知安全漏洞:sudo yum update httpd
4. 监控服务日志:定期检查服务日志,发现异常活动:sudo journalctl -u httpd.service --since "1 day ago"
5. 使用SELinux:启用SELinux增强系统安全性:
“`bash检查SELinux状态sudo getenforce

最小权限原则:以最低必要权限运行服务,避免使用root用户运行服务:
  1. [Service]
  2. User=myuser
  3. Group=mygroup
复制代码

限制服务访问:使用防火墙规则限制服务的网络访问:
  1. sudo firewall-cmd --permanent --add-service=http
  2. sudo firewall-cmd --reload
复制代码

定期更新服务:保持服务软件更新,修复已知安全漏洞:
  1. sudo yum update httpd
复制代码

监控服务日志:定期检查服务日志,发现异常活动:
  1. sudo journalctl -u httpd.service --since "1 day ago"
复制代码

使用SELinux:启用SELinux增强系统安全性:
“`bash

sudo getenforce

# 设置SELinux为强制模式
   sudo setenforce 1
   “`

总结

本文全面介绍了在CentOS系统中使用systemctl命令管理服务的方法,从基础操作到高级技巧。通过掌握systemctl命令,系统管理员可以高效地启动、停止、监控和管理各种系统服务,从而提升服务器运维效率。

关键要点回顾:

1. systemctl是systemd系统和服务管理器的命令行接口,是CentOS 7及以后版本管理服务的主要工具。
2. 基本服务管理操作包括启动(start)、停止(stop)、重启(restart)和重载(reload)服务。
3. 使用enable和disable命令可以控制服务的开机自启动行为。
4. 通过status、is-active和journalctl命令可以监控服务状态和查看服务日志。
5. 高级功能如掩码服务、管理服务依赖关系和创建自定义服务可以满足更复杂的管理需求。
6. 实战案例展示了如何管理常见服务如Web服务器、数据库和防火墙。
7. 故障排除部分提供了常见问题的解决方法。
8. 最佳实践部分强调了服务管理的规范、自动化和安全考虑。

通过深入理解和熟练应用systemctl命令,系统管理员可以更高效地管理CentOS服务器,确保服务的稳定运行,并快速响应各种运维需求。在日常工作中不断实践和积累经验,将使您成为服务管理的专家。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

手机版|联系我们|小黑屋|TG频道|RSS |网站地图

Powered by Pixtech

© 2025-2026 Pixtech Team.

>