☰
TIL 学习笔记:Linux 下用 `initctl list` 一次查看全部 Upstart 任务及其状态
2026/10/7 7:15:43 网站建设 项目流程
  • 文档
  • 教程
  • 知识库

【免费下载链接】til

:memo: Today I Learned

项目地址:https://gitcode.com/gh_mirrors/ti/til
点击查看免费下载

在运行 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、nginxnginx
goal(目标)任务被期望达到的状态:start表示希望运行,stop表示希望停止start/stop
state(当前状态)任务此刻实际所处的阶段,如waiting、runningrunning/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

项目地址:https://gitcode.com/gh_mirrors/ti/til
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询