查看运行中的程序

在《Linux 基础》模块中,我们练习的大多是“敲一条命令、看一眼结果”的即时操作:用 cat 查看文件、用 grep 过滤文本,命令跑完,终端就回到提示符等待下一条指令。

但在真实服务器上,网站、数据库和各类后台服务一旦启动,就需要在后台长期运行。接手一台 Linux 服务器后,我们经常要处理这些问题:

  • 后台正在跑哪些程序?占了多少 CPU 和内存?
  • 怎么安装软件,并为服务分配专用的低权限账号和目录?
  • 怎么把程序配置成系统服务,让它开机自启、崩溃后自动拉起?
  • 服务连不上或报错时,怎么顺着日志、配置和端口定位原因?
  • 怎么备份关键数据,并设置定时任务自动执行?

本模块我们将接手一个“图书馆公告服务”,从查看进程开始,一步步完成 Linux 系统的日常运维与服务管理。

打开管理实验终端

先从下方的任务卡启动 OPSBOX 终端,默认登录身份是 crow。正文中行首带 crow@opsbox 的命令,都可以在这个网页终端里直接输入。

查看和控制自己的进程

Lab

打开 OPSBOX 终端 OPSBOX 终端(启动 Lab 后显示),完成本章与下一章的进程练习。 将此前暂停的 sleep 进程用 bg 恢复到后台后,用 ps 查看它的 STAT 状态。它处于等待状态时,STAT 开头的状态字母是什么?提交一个大写字母。 完成下一章末尾的进程清理后再提交。

加载会话状态…

提交 coin

题解 Hint

实验环境里的 crow 账号已经配置了 sudo 权限。在命令前加上 sudo,就能临时以超级管理员(root)身份执行安装软件、创建账号或管理系统服务等操作。

注意

本模块包含四个实验练习,每个实验都会启动一台独立的实验机。提交答案后实例不会自动销毁,请跟着正文做完对应的操作练习,结束时再手动关闭环境。

进入终端后,先确认当前身份和权限:

crow@opsbox:~$ whoami
crow
crow@opsbox:~$ hostname
opsbox
crow@opsbox:~$ sudo whoami
root
crow@opsbox:~$ whoami
crow

sudo whoami 会以 root 身份执行单条命令,因此输出 root;执行完后,终端依然保持普通的 crow 身份。运行 sudo -l 可以查看当前账号被授予的 sudo 权限范围。

OPSBOX 终端中的 crow 身份和 sudo 授权

程序文件与进程

存放在磁盘上的文件(比如 /usr/bin/sleep)只是一份静态的二进制代码。当我们在终端输入命令回车执行时,内核把代码读进内存,分配独立的虚拟内存空间、文件描述符表和运行上下文,这就产生了一个正在运行的进程(Process)。

如果在两个终端窗口里分别执行 sleep 300,系统就会基于同一份程序文件创建两个互不干扰的进程。内核会给每个进程分配唯一的正整数编号,称为进程 ID(PID)。Linux 中的所有进程构成一棵以初始化进程(PID 1,现代发行版中通常为 systemd)为根的进程树,新进程都是由现有父进程派生出来的。

同一个程序文件可以产生两个独立进程

为了看清后台进程的生命周期,我们先拿系统自带的 sleep 300(休眠等待 300 秒)做实验。在命令末尾加上 &,可以让程序直接在后台运行,不占用当前终端:

crow@opsbox:~$ sleep 300 &
[1] 2140
crow@opsbox:~$ ps -p 2140 -o pid,ppid,user,stat,comm
    PID    PPID USER     STAT COMMAND
   2140    2100 crow     S    sleep

注:这里的 PID 2140 只是示例,实际操作时请换成你终端里输出的编号。

ps(Process Status)用于查看当前进程快照。-p 指定要看的 PID,-o 自定义输出的字段列:

列名含义
PID进程的唯一编号
PPID创建该进程的父进程编号(Parent PID,这里就是当前的 bash 终端)
USER进程的运行用户身份(决定该进程能访问哪些文件)
STAT进程当前的运行状态码
COMMAND进程运行的命令名称

STAT 列首字母代表进程的五种常见状态:

  • R(Running / Runnable):正在 CPU 上执行,或在运行队列中排队等待调度。
  • S(Interruptible Sleep):可中断睡眠。进程正在等待某个事件(如网络数据包到达、终端输入或定时器到期),事件发生或收到信号就会唤醒。绝大多数空闲后台服务都处于 S 状态。
  • D(Uninterruptible Sleep):不可中断睡眠。通常在等待底层磁盘或网络存储 I/O 返回,期间连强制信号也无法立即打断。如果大量进程卡在 D 状态,往往说明磁盘读写出现瓶颈或故障。
  • T(Stopped):暂停或被跟踪状态。进程收到了暂停信号(如 SIGTSTP),等待收到继续信号后再恢复。
  • Z(Zombie):僵尸进程。进程已经执行完毕退出,但父进程还没调用 wait() 回收它的退出状态码,导致内核进程表里仍残留着一条空壳记录。

内核还会通过 /proc/<PID>/ 虚拟目录,把每个进程在内存里的实时信息映射成文件。排查可疑进程时,就算磁盘上的可执行文件被重命名或删掉了,也可以去 /proc/<PID>/ 目录下查看:

  • /proc/<PID>/cmdline:启动时的完整命令行参数(以空字符分隔,可用 tr '\0' ' ' 转换查看)。
  • /proc/<PID>/exe:指向磁盘上真实可执行文件的软链接。
  • /proc/<PID>/cwd:指向进程当前工作目录的软链接。
  • /proc/<PID>/fd/:包含该进程当前打开的所有文件描述符,能看到它打开了哪些日志、配置文件或网络套接字。

如果想按名字快速查找进程的 PID,可以用 pgrep:

crow@opsbox:~$ pgrep -a -u crow -x sleep
2140 sleep 300

其中 -u crow 限定只查 crow 用户的进程,-x sleep 要求精确匹配进程名 sleep,-a 同时打印完整命令行。结束进程前先用 pgrep 确认一眼,能避免误杀其他程序。

查看系统资源占用

在终端输入 top,可以打开全屏动态刷新的系统监控面板。按大写 P 按 CPU 占用排序,按大写 M 按内存占用排序,按 q 退出。

top 中的系统汇总与进程资源使用情况

在 top 列表里找到刚才启动的 sleep,它的 %CPU 几乎一直是 0.0。排查服务器卡顿时,可以先用 top 看一眼到底是某个进程死循环占满了 CPU,还是大伙都在等待磁盘读写或网络响应。

另外两条常用命令可以快速查看内存与负载概况:

crow@opsbox:~$ free -h
crow@opsbox:~$ uptime
  • free -h:查看内存使用量。看剩余可用内存时重点看 available 列(包含了可随时回收的系统缓存 Buffer/Cache),而不是只看 free 列;
  • uptime:查看系统运行时长,以及最近 1、5、15 分钟的平均负载(Load Average),反映处于 R(运行/排队)和 D(等待磁盘 I/O)状态的平均进程数。

进入下一章前,先用 kill 把刚才后台运行的 sleep 进程停掉:

crow@opsbox:~$ kill 2140
crow@opsbox:~$ pgrep -a -u crow -x sleep

再次运行 pgrep 没有输出,说明进程已经退出。