首页/系统/信创系统运维速查/systemctl 服务启停与状态查看
服务与运维65 条

systemctl 服务启停与状态查看

systemd 下服务管理的入口命令:start/stop/restart 控制运行状态,status 查看详情,is-active/is-enabled 适合脚本判断,麒麟 V10、UOS、openEuler 通用。

信创系统运维速查系统更新于 2026-10-13

systemctl 与 systemd 的关系

systemctl 是 systemd 初始化系统的管理前端。开机后 systemd 以 PID 1 常驻,把服务、挂载、定时任务、socket 都抽象成「单元(unit)」,systemctl 负责按单元名执行启停、状态查询和开机自启管理。麒麟 V10 服务器版、统信 UOS 服务器版、openEuler、CentOS 7 及以上都已是 systemd 体系,老的 service、chkconfig 命令只是兼容外壳,底层仍转调 systemctl,所以新脚本统一写 systemctl 更可靠。单元文件分两层:/usr/lib/systemd/system 是软件包自带的原始定义,/etc/systemd/system 是管理员覆盖层,同名单元以后者为准。

基本信息

所属组件systemd(PID 1)
适用平台Kylin V10 / UOS 服务器版 / openEuler / CentOS 7+
语法systemctl [子命令] [单元名]
权限status、is-active 普通用户可查;start/stop/enable 需 root 或 sudo
单元目录/usr/lib/systemd/system 包自带,/etc/systemd/system 管理员覆盖

典型使用场景

  • 上线后启动服务并设为开机自启:enable --now 一步完成两件事
  • 排障时先看状态再看日志:status 给出主进程号与最近几条日志,比翻文件快
  • 改完配置重载而非重启:支持 reload 的服务可不断开已有连接
  • 脚本里做健康判断:is-active --quiet 只看退出码,不产生任何输出
  • 批量巡检:list-units --state=failed 一次列出所有异常单元
  • 临时屏蔽服务:mask 让手工和依赖都无法拉起,排查冲突时常用

常用操作

常用操作
systemctl start nginx            # 启动,未 enable 时重启机器不会自动拉起
systemctl stop nginx             # 停止
systemctl restart nginx          # 停止再启动,会断开现有连接
systemctl reload nginx           # 只重读配置,不断连接,需服务自身支持
systemctl status nginx           # 状态详情 + 最近日志
systemctl enable --now nginx     # 开机自启并立即启动
systemctl disable nginx          # 取消开机自启,不影响当前运行
systemctl is-active nginx; systemctl is-enabled nginx   # 输出 active / enabled

status 输出逐行读法

输出行含义异常特征
Loaded单元文件路径与是否开机自启not-found 表示单元名写错或没装
Active当前状态与持续时间failed 需查日志;activating 反复出现说明在重启循环
Main PID主进程号为 0 或消失说明进程已退出
Docs官方文档入口缺省不影响运行
CGroup进程所属控制组可据此确认服务实际拉起的所有子进程

常用查询操作

常用查询操作
systemctl list-units --type=service --state=failed   # 只看失败服务
systemctl list-unit-files --state=enabled             # 已设自启的单元
systemctl cat nginx                                   # 查看生效的单元文件内容
systemctl show nginx -p MainPID,ActiveState            # 取具体属性值
systemctl mask firewalld                              # 彻底屏蔽,比 disable 更硬
systemctl reset-failed nginx                          # 清掉失败计数,便于重新观察
退出码是脚本判断的关键:is-active 返回 0 表示运行中,返回非 0(通常 3)表示未运行;is-enabled 返回 0 表示已设自启。因此写判断用 systemctl is-active --quiet nginx,靠退出码分支,不要用 grep 去匹配文案。
restart 会短暂中断服务。数据库、网关、消息队列这类有长连接的组件应先确认维护窗口;服务支持 reload 时(如 nginx、sshd、rsyslog)优先 reload。reload 失败说明单元没定义 ExecReload,此时只能 restart。
enable 与 start 是两件事:enable 只写开机自启的软链,start 只管当前这次运行。麒麟与 UOS 部分软件包默认 vendor preset 为 disabled,装完不会自启,需要手工 enable。list-unit-files 的第二列会显示 preset 状态。

单元状态取值对照

状态值含义下一步动作
active (running)主进程正在运行正常,留意 Tasks 与 Memory 是否异常增长
active (exited)一次性任务已执行完并正常退出oneshot 类单元的正常状态,不算故障
inactive (dead)当前未运行需要时 start,并确认是否需要 enable
failed启动或运行中报错退出用 journalctl -u 单元 -n 100 找真实原因
activating (auto-restart)正按重启策略反复拉起重点查程序自身退出码,别只盯 systemd

排查服务起不来的顺序

  • systemctl status 看 Active 行与最后一条日志提示
  • journalctl -u 单元 -n 100 看程序自己打印的报错
  • systemctl cat 单元确认实际生效的 ExecStart 与参数
  • 确认端口没被占用,用 ss -lntp 对照监听情况
  • 确认依赖单元已就绪:网络、数据库、挂载点
  • 必要时 systemd-analyze verify 检查单元语法与依赖错误
同一套单元定义可以带参数复用,写成 名称@实例.service 的形式,例如 名称@8080.service,单元里用 %i 引用实例名,适合在同一台机器上跑多份同构实例;多实例场景用 %i,需要主机名等其它变量时也有对应占位符,具体以 systemd.unit 手册为准。

易错点

  • reload 与 restart 语义不同:配置不支持 reload 时执行 reload 会直接报错并保持旧配置运行,让人误以为已生效
  • 改完单元文件只 restart 不 daemon-reload,systemd 仍用旧定义,现象是改了没反应
  • 用 service 与 systemctl 混写判断逻辑,两者返回码与输出格式不一致,脚本会出现假成功
  • mask 比 disable 更强制,排障后忘记 unmask 会导致后续怎么启动都失败

数据来源与参考

  • man 1 systemctl(systemd)
  • openEuler 文档:使用 systemd 管理系统服务
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌