{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2025-01-06 13:37:44","updateBy":"admin","updateTime":"2025-09-08 10:59:35","remark":null,"id":98,"articleTitle":"每天一个Linux命令（二十二）systemctl","articleUrl":"linux_systemctl","articleThumbnail":"https://www.asumimoe.com/imgfiles/20250301/b95d839fa195428cb42fc7f104f50b0d.png","articleFlag":"0","draftStatus":"1","reprintStatement":"0","articleSummary":"systemctl是 Linux 系统中用于管理系统服务的命令，基于 Systemd 服务管理器。它支持启动、停止、重启服务，查看服务状态，以及管理服务依赖关系等操作。Systemd 是现代 Linux 发行版（如 CentOS 7+、Ubuntu 16.04+）中默认的服务管理工具。","articleContent":"`systemctl` 是 Linux 系统中用于**管理系统服务**的命令，基于 Systemd 服务管理器。它支持启动、停止、重启服务，查看服务状态，以及管理服务依赖关系等操作。Systemd 是现代 Linux 发行版（如 CentOS 7+、Ubuntu 16.04+）中默认的服务管理工具。\n\n---\n\n## 语法\n\n```bash\nsystemctl [选项] 命令 [服务名]\n```\n\n---\n\n## 常用命令\n\n| 命令              | 说明                           |\n| ----------------- | ------------------------------ |\n| `start`           | 启动服务                       |\n| `stop`            | 停止服务                       |\n| `restart`         | 重启服务                       |\n| `reload`          | 重新加载服务配置               |\n| `enable`          | 启用服务开机自启动             |\n| `disable`         | 禁用服务开机自启动             |\n| `status`          | 查看服务状态                   |\n| `list-units`      | 列出所有单元（服务、挂载点等） |\n| `list-unit-files` | 列出所有单元文件               |\n| `is-active`       | 检查服务是否运行               |\n| `is-enabled`      | 检查服务是否启用               |\n| `mask`            | 屏蔽服务（禁止启动）           |\n| `unmask`          | 取消屏蔽服务                   |\n| `daemon-reload`   | 重新加载 Systemd 配置          |\n| `edit`            | 生成一个临时的可编辑的服务文件 |\n\n---\n\n## 基础使用示例\n\n### 1. 启动服务\n\n```bash\nsystemctl start nginx\n```\n\n### 2. 停止服务\n\n```bash\nsystemctl stop nginx\n```\n\n### 3. 重启服务\n\n```bash\nsystemctl restart nginx\n```\n\n### 4. 重新加载服务配置\n\n```bash\nsystemctl reload nginx\n```\n\n### 5. 启用服务开机自启动\n\n```bash\nsystemctl enable nginx\n```\n\n### 6. 禁用服务开机自启动\n\n```bash\nsystemctl disable nginx\n```\n\n### 7. 查看服务状态\n\n```bash\nsystemctl status nginx\n```\n\n输出示例：\n\n```bash\n● nginx.service - A high performance web server and a reverse proxy server\n     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)\n     Active: active (running) since Tue 2023-10-10 14:30:00 UTC; 5min ago\n       Docs: man:nginx(8)\n    Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)\n    Process: 5678 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)\n   Main PID: 9012 (nginx)\n      Tasks: 3 (limit: 19106)\n     Memory: 10.5M\n        CPU: 345ms\n     CGroup: /system.slice/nginx.service\n             ├─9012 \"nginx: master process /usr/sbin/nginx -g daemon on; master_process on;\"\n             ├─9013 \"nginx: worker process\"\n             └─9014 \"nginx: worker process\"\n\nOct 10 14:30:00 server-hostname systemd[1]: Starting A high performance web server and a reverse proxy server...\nOct 10 14:30:00 server-hostname systemd[1]: Started A high performance web server and a reverse proxy server.\n```\n\n#### 1）服务概述行 (`● nginx.service...`)\n\n*   **`nginx.service`**: 系统服务的完整名称。\n*   **`- A high performance...`**: 这是服务的描述信息，在服务文件 (`nginx.service`) 中定义，说明了这个服务是做什么的。\n\n#### 2）服务配置和状态（最关键的部分）\n\n*   **`Loaded`**: **服务单元文件的加载状态**。\n    *   `loaded`: 表示单元文件已被成功加载。\n    *   `/lib/systemd/system/nginx.service`: 单元文件所在的路径。\n    *   `enabled`: **表示服务已设置为开机自动启动**。如果是 `disabled`，则表示不会开机自启。\n    *   `vendor preset: enabled`: 表示软件包提供商（如 apt、yum）的默认设置是“启用”。\n*   **`Active`**: **服务的当前活动状态**。这是最需要关注的信息之一。\n    *   `active (running)`: 服务正在正常运行。这是健康的状态。\n    *   `inactive (dead)`: 服务完全停止。\n    *   `active (exited)`: 服务已成功执行完一次任务后退出（适用于单次运行的服务）。\n    *   `active (waiting)`: 服务正在运行，但在等待某个事件。\n    *   `failed`: **服务启动失败**。这是一个错误状态，需要根据下面的日志进一步排查。\n    *   `since Tue 2023-10-10 14:30:00 UTC`: 服务进入当前状态（如启动）的时间。\n    *   `5min ago`: 服务运行了多长时间。\n\n#### 3）进程和执行信息\n\n*   **`Docs`**: 提供与该服务相关的文档信息，这里是 `man:nginx(8)`，表示可以通过 `man 8 nginx` 命令查看手册。\n*   **`Process: 1234 ExecStartPre=...`**: 显示在启动主服务之前运行的预处理命令（`ExecStartPre`）及其进程ID（PID）和退出状态。这里是在真正启动Nginx前执行 `nginx -t` 测试配置文件语法是否正确。`status=0/SUCCESS` 表示测试通过。\n*   **`Process: 5678 ExecStart=...`**: 显示实际启动服务的命令及其状态。`status=0/SUCCESS` 表示启动命令成功执行。\n*   **`Main PID`**: 服务的主进程ID（PID）。对于Nginx，这就是 `master process` 的PID。\n\n#### 4）资源使用情况\n\n*   **`Tasks`**: 当前由该服务产生的进程/线程数量。Nginx通常有1个master进程和多个worker进程。\n*   **`Memory`**: 该服务及其所有子进程当前占用的物理内存总量。\n*   **`CPU`**: 该服务及其所有子进程消耗的CPU总时间。\n\n#### 5）控制组 (`CGroup`) 信息\n\n*   这里列出了由该服务管理的所有进程树（CGroup 中的进程）。对于Nginx：\n    *   `├─9012 \"nginx: master process...\"`: Master 主进程，负责读取配置、管理Worker进程。\n    *   `├─9013 \"nginx: worker process\"`: Worker 工作进程，负责处理实际的客户端请求。通常会有多个。\n\n#### 6）日志片段\n\n*   输出底部显示了来自 `systemd` 日志（journal）的最近几条相关消息。这对于诊断启动、停止或重启时的问题至关重要。\n    *   第一行 `Starting...` 表示系统开始启动Nginx服务。\n    *   第二行 `Started...` 表示系统成功启动Nginx服务。\n    *   **如果服务启动失败（`Active: failed`），这里会显示错误信息**，例如“Failed to parse configuration file”（配置文件解析失败）或“Address already in use”（端口被占用），这是解决问题的直接线索。\n\n---\n\n## 进阶用法\n\n### 1. 列出所有服务\n\n```bash\nsystemctl list-units --type=service\n```\n\n输出示例：\n\n```bash\nUNIT                      LOAD   ACTIVE SUB     DESCRIPTION\nnginx.service             loaded active running A high performance web server and a reverse proxy server\nsshd.service              loaded active running OpenSSH server daemon\n```\n\n### 2. 列出所有已启用的服务\n\n```bash\nsystemctl list-unit-files --state=enabled\n```\n\n输出示例：\n\n```bash\nUNIT FILE              STATE\nnginx.service          enabled\nsshd.service           enabled\n```\n\n### 3. 检查服务是否运行\n\n```bash\nsystemctl is-active nginx\n```\n\n输出示例：\n\n```bash\nactive\n```\n\n### 4. 检查服务是否启用\n\n```bash\nsystemctl is-enabled nginx\n```\n\n输出示例：\n\n```bash\nenabled\n```\n\n### 5. 屏蔽服务（禁止启动）\n\n```bash\nsystemctl mask nginx\n```\n\n输出示例：\n\n```bash\nCreated symlink /etc/systemd/system/nginx.service → /dev/null.\n```\n\n### 6. 取消屏蔽服务\n\n```bash\nsystemctl unmask nginx\n```\n\n输出示例：\n\n```bash\nRemoved /etc/systemd/system/nginx.service.\n```\n\n### 7.查看服务配置\n\n```bash\nsystemctl cat nginx\n```\n\n输出示例：\n\n```bash\n# /usr/lib/systemd/system/nginx.service\n[Unit]\nDescription=The nginx HTTP and reverse proxy server\nAfter=network-online.target remote-fs.target nss-lookup.target\nWants=network-online.target\n\n[Service]\nType=forking\nPIDFile=/run/nginx.pid\n# Nginx will fail to start if /run/nginx.pid already exists but has the wrong\n# SELinux context. This might happen when running `nginx -t` from the cmdline.\n# https://bugzilla.redhat.com/show_bug.cgi?id=1268621\nExecStartPre=/usr/bin/rm -f /run/nginx.pid\nExecStartPre=/usr/sbin/nginx -t\nExecStart=/usr/sbin/nginx\nExecReload=/usr/sbin/nginx -s reload\nKillSignal=SIGQUIT\nTimeoutStopSec=5\nKillMode=process\nPrivateTmp=true\n\n[Install]\nWantedBy=multi-user.target\n```\n\n### 7. 重新加载 Systemd 配置\n\n```bash\nsystemctl daemon-reload\n```\n\n---\n\n## 实际应用场景\n\n### 1. 管理 Web 服务器\n\n```bash\nsystemctl start nginx\nsystemctl enable nginx\n```\n\n### 2. 管理数据库服务\n\n```bash\nsystemctl restart mysql\nsystemctl status mysql\n```\n\n### 3. 管理 SSH 服务\n\n```bash\nsystemctl reload sshd\nsystemctl is-active sshd\n```\n\n### 4. 管理定时任务\n\n```bash\nsystemctl start cron\nsystemctl enable cron\n```\n\n### 5. 管理系统日志\n\n```bash\nsystemctl restart rsyslog\nsystemctl status rsyslog\n```\n\n### 6. 管理防火墙\n\n```bash\nsystemctl stop firewalld\nsystemctl disable firewalld\n```\n\n### 7. 管理系统时间同步\n\n```bash\nsystemctl start chronyd\nsystemctl enable chronyd\n```\n\n---\n\n## 高级功能\n\n### 1. 查看服务依赖关系\n\n```bash\nsystemctl list-dependencies nginx\n```\n\n输出示例：\n\n```bash\nnginx.service\n● ├─system.slice\n● └─basic.target\n●   ├─alsa-restore.service\n●   ├─firewalld.service\n●   ├─sysinit.target\n●   │ ├─dev-hugepages.mount\n●   │ ├─dev-mqueue.mount\n```\n\n### 2. 查看服务日志\n\n```bash\njournalctl -u nginx\n```\n\n输出示例：\n\n```bash\n-- Logs begin at Mon 2024-01-10 15:30:45 UTC, end at Mon 2024-01-10 16:30:45 UTC. --\nJan 10 15:30:45 hostname systemd[1]: Starting A high performance web server and a reverse proxy server...\nJan 10 15:30:45 hostname nginx[1234]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok\nJan 10 15:30:45 hostname nginx[1234]: nginx: configuration file /etc/nginx/nginx.conf test is successful\n```\n\n### 3. 设置服务超时时间\n\n```bash\nsystemctl edit nginx\n```\n\n在编辑器中添加：\n\n```bash\n[Service]\nTimeoutStartSec=30s\nTimeoutStopSec=10s\n```\n\n### 4. 限制服务资源使用\n\n```bash\nsystemctl edit nginx\n```\n\n在编辑器中添加：\n\n```bash\n[Service]\nMemoryMax=512M\nCPUQuota=50%\n```\n\n### 5. 自定义服务启动顺序\n\n```bash\nsystemctl edit nginx\n```\n\n在编辑器中添加：\n\n```bash\n[Unit]\nAfter=network.target\nRequires=network.target\n```\n\n### 6. 查看服务环境变量\n\n```bash\nsystemctl show nginx -p Environment\n```\n\n输出示例：\n\n```bash\nEnvironment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin\n```\n\n### 7. 重启所有服务\n\n```bash\nsystemctl reboot\n```\n\n---\n\n## 学习资源\n\n- [Systemd 官方文档](https://www.freedesktop.org/wiki/Software/systemd/)\n- [Systemd 中文指南](https://wiki.archlinux.org/title/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87))\n- [Systemd Cheat Sheet](https://devhints.io/systemd)","categoryId":1,"viewCount":81,"categoryName":"Linux","author":"球接子","authorAvatar":null,"tagIds":[10],"tagNames":["Linux基础"]}}