- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
在运行 Upstart 作为 init 守护进程的 Linux 系统(例如 Ubuntu 6.10 至 14.10 时代的环境)中,initctl是查询与控制任务(job)的核心命令行工具。本文基于 TIL 仓库中 linux/list-the-statuses-of-all-upstart-jobs.md 一文,完整讲解如何用initctl list一次性列出系统已知的所有 Upstart 任务、解读每一行的状态字段,并延伸到单任务查询、启停控制与同族命令的对比,帮助你快速掌握这类老牌 init 系统的日常运维手段。
背景:Upstart 与 initctl 是什么
Upstart 是事件驱动的 init 守护进程,由 Canonical 开发,用于替代传统的 System V init:系统启动、服务启停不再依赖严格的启动脚本顺序,而是由事件(event)触发任务(job)执行。每个任务都有自己声明的goal(目标)与所处的state(状态),initctl就是用户与 Upstart 守护进程之间的控制接口——类似 systemd 时代systemctl的角色,几乎所有查询和控制操作都由它完成。
Upstart 任务的定义通常位于/etc/init/*.conf配置文件中,initctl list会把所有这些"已知任务"连同当前状态一次性展示出来,非常适合在排查服务未启动、进程异常退出等问题时快速定位。
核心操作:用initctl list列出所有任务状态
命令本身非常简洁,直接执行即可:
$ initctl list它的输出大致如下(不同发行版、不同安装环境下任务列表会有差异):
console stop/waiting mounted-run stop/waiting acpid start/running, process 2927 checkfs.sh start/running checkroot-bootclean.sh start/running kmod stop/waiting mountnfs.sh start/running nginx stop/waiting plymouth-stop stop/waiting rcS stop/waiting ufw start/running正如原始文档所说,这份列表会告诉你每个任务当前是处于"已停止"还是"已启动"状态。上面的输出中可以看到acpid、ufw等任务处于运行状态,而nginx、rcS等任务处于停止状态。
解读输出格式:goal / state / process
每一行由三个核心信息构成:
| 字段 | 含义 | 示例 |
|---|---|---|
| 任务名 | 该行的第一列,如acpid、nginx | nginx |
| goal(目标) | 任务被期望达到的状态:start表示希望运行,stop表示希望停止 | start/stop |
| state(当前状态) | 任务此刻实际所处的阶段,如waiting、running | running/waiting |
| process(进程) | 任务主进程的 PID,仅当任务有实际进程时才出现 | process 2927 |
逐行解读示例输出:
acpid start/running, process 2927:目标是start,当前状态是running,说明 acpid 正在运行,主进程 PID 为 2927。nginx stop/waiting:目标是stop,当前状态是waiting,说明 nginx 未被启动。ufw start/running:目标是start且正在运行,但行尾没有process字段——这类任务通常是脚本型(task)任务,不驻留常驻进程,因此不记录具体 PID。mounted-run stop/waiting、rcS stop/waiting同理,均处于停止/等待阶段。
简单总结:状态列(第二字段)才是任务当前的真实处境,running表示运行中,waiting表示已停止或尚未启动;goal则反映配置或最近一次控制操作希望它处于的状态。
过滤查看特定任务
当任务很多时,配合管道过滤即可快速聚焦:
$ initctl list | grep nginx nginx stop/waiting这条组合在排查"某个服务到底有没有起来"时非常实用,输出一目了然。
查看单个任务状态
如果只关心某一个任务,无需全量列出,可以直接用status子命令:
$ initctl status nginx nginx stop/waiting输出格式与list中该任务对应的行一致,适合在脚本中精确判断单个服务的状态。
控制任务:启动、停止、重启
initctl不只是查询工具,也可以对任务进行生命周期管理:
$ initctl start nginx # 启动任务 $ initctl stop nginx # 停止任务 $ initctl restart nginx # 重启任务 $ initctl reload nginx # 重新加载配置需要说明的是,查询类操作(list、status)在文档示例中可直接执行;而start、stop、restart这类管理操作通常需要 root 权限,实际使用时应配合sudo:
$ sudo initctl restart nginx与service --status-all的对比
如果你的系统同时保留了 SysV 风格的/etc/init.d/脚本,还可以用 devops/check-the-status-of-all-services.md 中记录的service --status-all来检查所有 init.d 服务的状态——+表示运行中,-表示未运行,?表示无法确定。两者视角不同:
initctl list面向 Upstart 任务(/etc/init/),字段语义明确(goal/state/process);service --status-all面向/etc/init.d/下的 SysV 服务脚本,适合兼容层场景。
在同时存在两套体系的过渡期系统上,可以结合二者交叉核对同一个服务的真实状态。
适用前提:如何确认系统运行 Upstart
initctl命令只有在该系统以 Upstart 作为 init 守护进程时才存在。判断方法很简单:
$ which initctl # 存在则说明系统带有 Upstart 工具集 $ ps -p 1 -o comm= # 输出为 init 即典型 Upstart/SysV 风格;输出为 systemd 则说明已是 systemd 环境历史背景:Upstart 在 Ubuntu 6.10 至 14.10 之间是默认 init 方案,Ubuntu 15.04 起切换为 systemd。因此本文内容适用于仍运行 Upstart 的旧版 Ubuntu 服务器或容器,而不是现代默认 systemd 的系统——后者请使用systemctl list-units等命令。若需要确认当前 Ubuntu 版本,可参考仓库中的 linux/check-ubuntu-version.md。
延伸阅读
- 原始 TIL 文档:linux/list-the-statuses-of-all-upstart-jobs.md
- 同主题的 SysV 服务状态检查:devops/check-the-status-of-all-services.md
- 更多 Linux 运维速记:README.md(Linux 分类)
关于initctl更完整的子命令、事件机制与任务配置语法,可随时查阅系统手册:
$ man initctl- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
相关推荐
TIL 技术笔记:用 Linux timedatectl 查看与设置系统时间、时区与 NTP 同步状态
TIL 技术笔记:用 Linux timedatectl 查看与设置系统时间、时区与 NTP 同步状态 在排查远端服务器日志、分析异常时间戳或对齐多机时间时,第
文档教程知识库til 仓库运维实战:用 service --status-all 一键检查 Linux 全部服务状态
til 仓库运维实战:用 service status all 一键检查 Linux 全部服务状态 本指南围绕 til 仓库 devops/check the
文档教程知识库Homebrew 服务管理:使用 brew services list 查看全部守护服务状态
Homebrew 服务管理:使用 brew services list 查看全部守护服务状态 brew services list 是 Homebrew 提供的
文档教程知识库
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考