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 / enabledstatus 输出逐行读法
| 输出行 | 含义 | 异常特征 |
|---|---|---|
| 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 手册为准。