Skip to content
<

systemctl 基础用法

systemctl 是 systemd 系统和服务管理器的控制命令,用于管理系统服务。它是现代 Linux 发行版(如 CentOS 7+、Ubuntu 16.04+)中管理服务的主要工具。

📋 目录

什么是 systemd 和 systemctl

  • systemd:Linux 系统的初始化系统和服务管理器,负责启动和管理系统服务
  • systemctl:systemd 的命令行工具,用于控制 systemd 系统和服务管理器

为什么使用 systemctl?

  • 替代了传统的 servicechkconfig 命令
  • 提供更强大的服务管理功能
  • 支持并行启动服务,提高系统启动速度
  • 更好的依赖管理
  • 统一的日志管理

服务管理基础命令

启动服务

bash
# 启动服务
sudo systemctl start service_name

# 示例:启动 Nginx
sudo systemctl start nginx

停止服务

bash
# 停止服务
sudo systemctl stop service_name

# 示例:停止 Nginx
sudo systemctl stop nginx

重启服务

bash
# 重启服务
sudo systemctl restart service_name

# 示例:重启 Nginx
sudo systemctl restart nginx

重载服务配置

bash
# 重新加载配置文件(不中断服务)
sudo systemctl reload service_name

# 示例:重载 Nginx 配置
sudo systemctl reload nginx

启用/禁用服务

bash
# 设置服务开机自启
sudo systemctl enable service_name

# 取消服务开机自启
sudo systemctl disable service_name

# 示例:启用 Nginx 开机自启
sudo systemctl enable nginx

启用并启动服务

bash
# 同时启用和启动服务
sudo systemctl enable --now service_name

# 示例:启用并启动 Nginx
sudo systemctl enable --now nginx

服务状态查询

查看服务状态

bash
# 查看服务详细状态
sudo systemctl status service_name

# 示例:查看 Nginx 状态
sudo systemctl status nginx

状态输出说明:

  • active (running):服务正在运行
  • active (exited):服务已成功执行一次
  • inactive (dead):服务未运行
  • failed:服务启动失败

查看所有服务

bash
# 查看所有已加载的服务
systemctl list-units --type=service

# 查看所有服务(包括未加载的)
systemctl list-units --type=service --all

# 查看所有失败的服务
systemctl list-units --type=service --state=failed

查看服务是否启用

bash
# 查看服务是否开机自启
systemctl is-enabled service_name

# 示例
systemctl is-enabled nginx
# 输出:enabled 或 disabled

查看服务是否运行

bash
# 查看服务是否正在运行
systemctl is-active service_name

# 示例
systemctl is-active nginx
# 输出:active 或 inactive

服务日志查看

使用 journalctl 查看日志

bash
# 查看服务的所有日志
sudo journalctl -u service_name

# 查看最近 50 条日志
sudo journalctl -u service_name -n 50

# 实时跟踪日志(类似 tail -f)
sudo journalctl -u service_name -f

# 查看今天的日志
sudo journalctl -u service_name --since today

# 查看最近 1 小时的日志
sudo journalctl -u service_name --since "1 hour ago"

# 查看指定时间范围的日志
sudo journalctl -u service_name --since "2024-01-01 00:00:00" --until "2024-01-01 23:59:59"

# 按优先级过滤日志
sudo journalctl -u service_name -p err  # 只显示错误及以上级别

查看系统日志

bash
# 查看所有系统日志
sudo journalctl

# 查看内核日志
sudo journalctl -k

# 查看启动日志
sudo journalctl -b

# 查看上次启动的日志
sudo journalctl -b -1

服务配置文件

服务文件位置

systemd 服务配置文件通常位于:

  • /etc/systemd/system/ - 系统管理员创建的服务文件
  • /usr/lib/systemd/system/ - 软件包安装的服务文件
  • /run/systemd/system/ - 运行时创建的服务文件

查看服务配置

bash
# 查看服务配置文件内容
systemctl cat service_name

# 示例:查看 Nginx 服务配置
systemctl cat nginx

服务文件示例

一个典型的服务配置文件(.service 文件)示例:

ini
[Unit]
Description=Nginx Web 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=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重新加载 systemd 配置

修改服务配置文件后,需要重新加载 systemd:

bash
# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 然后重启服务使配置生效
sudo systemctl restart service_name

常用服务管理场景

场景 1:安装新服务后启用

bash
# 1. 安装服务(例如 Nginx)
sudo dnf install -y nginx

# 2. 启动服务
sudo systemctl start nginx

# 3. 设置开机自启
sudo systemctl enable nginx

# 4. 检查状态
sudo systemctl status nginx

场景 2:修改配置后重载

bash
# 1. 修改配置文件
sudo vim /etc/nginx/nginx.conf

# 2. 测试配置文件
sudo nginx -t

# 3. 重载配置(不中断服务)
sudo systemctl reload nginx

# 或者重启服务
sudo systemctl restart nginx

场景 3:排查服务问题

bash
# 1. 查看服务状态
sudo systemctl status service_name

# 2. 查看服务日志
sudo journalctl -u service_name -n 100

# 3. 查看错误日志
sudo journalctl -u service_name -p err

# 4. 实时跟踪日志
sudo journalctl -u service_name -f

场景 4:禁用不需要的服务

bash
# 1. 停止服务
sudo systemctl stop service_name

# 2. 禁用开机自启
sudo systemctl disable service_name

# 3. 检查状态
sudo systemctl status service_name

实战示例

示例 1:管理 Nginx 服务

bash
# 启动 Nginx
sudo systemctl start nginx

# 查看状态
sudo systemctl status nginx

# 启用开机自启
sudo systemctl enable nginx

# 重载配置
sudo systemctl reload nginx

# 查看日志
sudo journalctl -u nginx -f

示例 2:管理 MySQL 服务

bash
# 启动 MySQL
sudo systemctl start mysqld

# 查看状态
sudo systemctl status mysqld

# 启用开机自启
sudo systemctl enable mysqld

# 查看错误日志
sudo journalctl -u mysqld -p err

示例 3:管理 Docker 服务

bash
# 启动 Docker
sudo systemctl start docker

# 启用开机自启
sudo systemctl enable docker

# 查看状态
sudo systemctl status docker

# 重启 Docker
sudo systemctl restart docker

示例 4:管理 SSH 服务

bash
# 查看 SSH 服务状态
sudo systemctl status sshd

# 重启 SSH 服务(修改配置后)
sudo systemctl restart sshd

# 查看 SSH 登录日志
sudo journalctl -u sshd | grep "Accepted"

示例 5:创建自定义服务

创建一个简单的自定义服务示例:

bash
# 1. 创建服务文件
sudo vim /etc/systemd/system/myapp.service

服务文件内容:

ini
[Unit]
Description=My Custom Application
After=network.target

[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
bash
# 2. 重新加载 systemd
sudo systemctl daemon-reload

# 3. 启用并启动服务
sudo systemctl enable --now myapp

# 4. 查看状态
sudo systemctl status myapp

常用命令速查表

命令说明
systemctl start service启动服务
systemctl stop service停止服务
systemctl restart service重启服务
systemctl reload service重载配置
systemctl status service查看状态
systemctl enable service启用开机自启
systemctl disable service禁用开机自启
systemctl enable --now service启用并启动
systemctl is-active service检查是否运行
systemctl is-enabled service检查是否启用
systemctl list-units --type=service列出所有服务
systemctl daemon-reload重新加载配置
journalctl -u service查看服务日志
journalctl -u service -f实时查看日志

💡 最佳实践

  1. 修改配置后记得重载:修改服务配置文件后,使用 systemctl daemon-reload 重新加载
  2. 使用 reload 而非 restart:如果服务支持,优先使用 reload 而不是 restart,避免中断服务
  3. 定期检查失败的服务:使用 systemctl list-units --state=failed 检查失败的服务
  4. 查看日志排查问题:遇到问题时,使用 journalctl 查看详细日志
  5. 测试配置:修改配置后,先测试配置是否正确,再重载或重启服务

📝 总结

systemctl 是现代 Linux 系统服务管理的核心工具。掌握这些基础用法,可以高效地管理系统服务。记住:

  • 启动/停止/重启startstoprestart
  • 启用/禁用enabledisable
  • 查看状态statusis-activeis-enabled
  • 查看日志journalctl -u service_name
  • 重载配置daemon-reloadreload

希望这篇文章能帮助你更好地使用 systemctl 管理系统服务!🚀