systemctl命令详解
一、什么是 systemctlsystemctl是 Linux 系统中用于检查和控制系统状态的核心命令是systemd系统和服务管理器的管理工具。systemd 是主流 Linux 发行版默认的主进程PID 1它已取代传统的 SysV init采用并行启动方式显著提升了系统启动效率。基本语法格式为systemctl [选项...] 命令 [服务/单元名...]二、服务运行时管理启动/停止/重启/重载这类命令用于控制服务当前是否运行无需重启系统即可生效。操作命令说明启动服务systemctl start 服务名立即启动一个服务-停止服务systemctl stop 服务名立即停止一个服务-重启服务systemctl restart 服务名先停止再启动会有短暂中断重载配置systemctl reload 服务名不中断服务的情况下重新加载配置文件需要服务支持安全重载/重启systemctl reload-or-restart 服务名若能重载则重载否则重启有条件重启systemctl try-restart 服务名仅在服务运行中时才重启-应用场景修改配置文件后使用reload或restart使其生效遇到异常时先用stop停止处理完后再start。⚠️ 以上命令通常需要配合sudo使用。三、开机自启管理启用/禁用/屏蔽这类命令控制服务是否在系统启动时自动运行不影响服务当前状态除非配合--now使用。操作命令说明启用开机自启systemctl enable 服务名创建符号链接使服务在启动时自动运行禁用开机自启systemctl disable 服务名移除符号链接禁止自动启动立即启用并启动systemctl enable --now 服务名启用自启 立即启动原子操作立即禁用并停止systemctl disable --now 服务名禁用自启 立即停止屏蔽服务systemctl mask 服务名将服务链接到/dev/null禁止任何方式启动手动或依赖-解除屏蔽systemctl unmask 服务名恢复被屏蔽的服务-disable与mask的区别disable只是禁止开机自启手动启动依然有效-mask完全禁止启动无论是手动还是依赖都无法启动安全性更强-底层原理当执行systemctl enable service_name时systemd 会执行以下操作读取服务单元文件.service文件通常位于/usr/lib/systemd/system/或/etc/systemd/system/。检查单元文件中的[Install]部分找到WantedBy或RequiredBy指定的目标通常是multi-user.target。在对应的目标目录下如/etc/systemd/system/multi-user.target.wants/创建一个指向该服务单元文件的符号链接Soft Link。systemd 在启动过程中扫描这些.wants目录发现链接存在即启动对应服务。# 设置服务开机自启 sudo systemctl enable httpd.service # 简写省略 .service 后缀 sudo systemctl enable httpd输出示例Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.四、查看状态与信息操作命令说明查看服务详细状态systemctl status 服务名显示运行状态、进程PID、最近日志等检查是否运行中systemctl is-active 服务名仅返回 active/inactive适合脚本调用检查是否已启用自启systemctl is-enabled 服务名返回 enabled/disabled/static/masked检查是否失败systemctl is-failed 服务名返回服务是否处于失败状态查看服务属性systemctl show 服务名显示服务的所有配置属性如 MainPID、MemoryLimit 等查看合并后的配置systemctl cat 服务名显示服务原始配置 所有覆盖配置的合并结果显示依赖关系systemctl list-dependencies 服务名列出服务的所有依赖单元status输出示例解读以systemctl status sshd为例● sshd.service - OpenSSH server daemon Loaded: loaded (/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2023-04-28 12:34:56 UTC; 1 day 2h ago Main PID: 12345 (sshd) Memory: 12.8MLoaded单元文件是否加载成功包含文件路径和启用状态Active当前活跃状态active/running 表示正在运行Main PID主进程 ID下方会附带显示服务日志的最后 10 条Active 常见状态含义状态含义active (running)正在运行服务型单元active (exited)已退出但配置为常驻单次执行后保持在激活状态active (waiting)正在运行等待某个事件常见于 socket、timer 类型inactive未运行failed类似 inactive但服务曾因异常退出、崩溃或超时失败activating正在从 inactive 向 active 过渡deactivating正在从 active 向 inactive 过渡五、列出所有单元操作命令说明列出活动单元systemctl list-units仅显示 active、有等待任务或曾失败但仍有记录的单元列出所有单元systemctl list-units --all包括非活动单元列出指定类型systemctl list-units --typeservice只显示 service 类型的单元列出失败单元systemctl list-units --statefailed快速定位故障单元列出已安装单元文件systemctl list-unit-files列出所有已安装的单元文件及状态enabled/disabled/masked/static单元类型说明service服务单元最常见的类型如nginx.servicetarget目标单元用于分组管理如multi-user.targetsocket套接字单元如sshd.sockettimer定时器单元类似 cron 任务如systemd-tmpfiles-clean.timermount挂载点单元path路径监视单元device设备单元automount自动挂载单元snapshot快照单元scope作用域单元slice切片单元资源管理六、修改单元配置操作命令说明创建覆盖配置systemctl edit 服务名不修改原文件安全创建覆盖配置编辑原文件systemctl edit --full 服务名直接编辑主单元文件重新加载 systemdsystemctl daemon-reload修改任何单元文件后必须执行查看覆盖配置systemctl cat 服务名显示原始 所有覆盖配置的合并结果修改单元配置的标准流程systemctl edit 服务名创建覆盖配置修改后保存退出systemctl daemon-reload使 systemd 重新加载配置systemctl restart 服务名重启服务使配置生效配置文件存储路径优先级依次升高/usr/lib/systemd/system/系统默认配置由软件包提供/etc/systemd/system/用户自定义配置优先级更高手动修改应在此处七、系统操作关机/重启/睡眠/休眠操作命令说明立即重启systemctl reboot重启系统立即关机systemctl poweroff切断电源关机挂起睡眠systemctl suspend将状态保存到内存关闭大部分硬件按电源键唤醒休眠systemctl hibernate将状态保存到硬盘可完全断电混合睡眠systemctl hybrid-sleep同时挂起到内存和硬盘切换运行级别Targetsystemctl isolate target切换到指定的 target设置默认 Targetsystemctl set-default target设置系统默认启动目标如 graphical.target常见 Target运行级别Target说明default.target默认目标通常指向 multi-user.target 或 graphical.targetmulti-user.target多用户文本模式无图形界面graphical.target图形界面模式rescue.target救援模式单用户修复环境reboot.target重启目标poweroff.target关机目标 传统 SysV init 中的runlevel 3对应multi-user.targetrunlevel 5对应graphical.target。八、日志管理journalctlsystemctl本身不存储日志但可通过systemctl status查看最近 10 条日志并通过journalctl进行全面的日志查询。systemd-journald服务负责收集和存储日志默认处于启用状态-。操作命令说明查看服务日志journalctl -u 服务名查看指定服务的全部日志实时跟踪日志journalctl -u 服务名 -f类似tail -f实时输出新日志限制显示行数journalctl -u 服务名 -n 100只显示最后 100 行按时间过滤journalctl --since 1 hour ago查看最近 1 小时的日志查看当前启动日志journalctl -b仅显示本次启动后的日志按优先级过滤journalctl -p err只显示错误级别以上的日志err/warning/info/debug管理日志空间journalctl --vacuum-size500M将日志大小限制在 500MB 以内日志优先级级别从高到低0-emerg、1-alert、2-crit、3-err、4-warning、5-notice、6-info、7-debug。九、常用选项Options选项说明-t, --type类型按单元类型过滤如--typeservice,socket--state状态按状态过滤如--statefailed只显示失败的单元-p, --property属性与show命令配合只显示指定属性-a, --all显示所有单元包括非活动的-r, --recursive同时列出本地容器中的单元--reverse与list-dependencies配合仅显示反向依赖---after与list-dependencies配合仅显示After中的单元-q, --quiet安静模式不输出额外信息--h, --help显示帮助信息---version显示版本信息-十、综合示例# 1. 检查 Nginx 服务状态 systemctl status nginx # 2. 启动 Nginx 并设置开机自启原子操作 sudo systemctl enable --now nginx # 3. 修改 Nginx 配置后不中断服务地重载配置 sudo systemctl reload nginx # 4. 如果重载不可用则执行重启 sudo systemctl reload-or-restart nginx # 5. 临时禁用 Nginx 自启但不停止当前运行 sudo systemctl disable nginx # 6. 强制屏蔽一个服务禁止任何启动 sudo systemctl mask some-dangerous-service # 7. 查看所有失败的服务 systemctl list-units --statefailed # 8. 查看 Nginx 服务的完整日志 journalctl -u nginx --since 2 hours ago # 9. 实时监控 Nginx 日志 journalctl -u nginx -f # 10. 修改服务配置的标准流程 sudo systemctl edit nginx # 创建覆盖配置 # 编辑并保存后... sudo systemctl daemon-reload # 重新加载 systemd 配置 sudo systemctl restart nginx # 重启服务 # 11. 系统维护切换到单用户修复模式 sudo systemctl rescue # 12. 重启系统 sudo systemctl reboot十一、常见问题排查问题现象可能原因排查方法systemctl: command not found系统未使用 systemd如 Alpine、Devuan 等旧版或轻量级发行版ps -p 1检查 PID 1 是否为systemd-Failed to connect to busD-Bus 服务未运行sudo systemctl start dbus-服务启动失败配置错误、端口冲突、依赖缺失systemctl status 服务名journalctl -u 服务名 -n 50查看详细错误-服务无法停止进程僵死、资源锁定systemctl kill -s KILL 服务名强制终止daemon-reload后仍不生效编辑了错误的路径或未执行restart确认修改在/etc/systemd/system/下重启服务磁盘空间不足导致 systemctl 异常/var分区或日志目录空间耗尽df -h检查磁盘空间journalctl --vacuum-size500M清理日志-延伸阅读通过man systemctl或systemctl --help可获取完整的官方文档。