概述

  • 参考文档:Linux man-pages

  • 进程是运行中的程序实例,内核给每个进程一个 PID、一组状态与一张打开文件表,本篇的命令都在读或改这三样东西

  • 命令地图:

    flowchart LR
      A{"要做什么"} -->|"看进程"| B["ps pgrep pstree"]
      A -->|"结束进程"| C["kill pkill killall"]
      A -->|"查占用"| D["lsof fuser"]
      A -->|"调优先级"| E["nice renice"]
      A -->|"深挖单个"| F["/proc/PID"]

快速开始

console
$ ps aux | rg nginx         # 找进程
$ pgrep -a nginx            # 按名字找 PID 并显示完整命令行
$ kill 1234                 # 发默认信号 SIGTERM
$ lsof -i :443              # 谁在用 443 端口

查看进程

  • ps有两套选项风格,不要混搭:
    • BSD 风:ps aux,a所有终端进程、u用户友好格式、x连无终端的进程,日常用这套
    • System V 风:ps -ef,信息量等价,老脚本里常见
  • ps aux的列:%CPU与%MEM占用、VSZ虚拟内存(KB)、RSS常驻内存(KB)、STAT状态、TIME累计 CPU 时间
  • STAT状态码:
    • R运行或就绪、S可中断睡眠、Z僵尸(已退出待父进程收尸)、T暂停
    • D不可中断睡眠,通常在等 IO,这种状态连kill -9都无效,只能等 IO 返回或重启
    • 后缀:s会话首进程、l多线程、+前台进程组、<高优先级、N低优先级
  • 自定义输出与排序:ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head看吃 CPU 前几名
  • pgrep与pkill共用一套过滤条件:
    • -l附带名字,-a附带完整命令行,-u user限定用户,-t tty限定终端
    • -f匹配整条命令行而不只是程序名
    • -o最老的、-n最新的、-P 父PID某进程的直接子进程
  • pidof nginx精确按程序名取 PID,pstree -p看进程树确认父子关系

信号与结束进程

  • kill的本质是发信号,kill -l列出全部,常用的就这几个:
    • SIGTERM(15):默认信号,进程可以捕获并清理后退出,先发它
    • SIGKILL(9):内核直接回收,进程无法捕获,数据可能损坏,是最后手段
    • SIGINT(2):就是终端里的Ctrl+C
    • SIGHUP(1):挂断信号,守护进程惯例用它当"重读配置"用
    • SIGSTOP与SIGCONT:暂停与继续,Ctrl+Z发的是SIGTSTP
  • 标准姿势:kill PID,等几秒确认没死,再kill -9 PID
  • killall按进程名精确匹配发送,pkill按正则模式发送,pkill -f的匹配面覆盖整条命令行,误伤风险最大:
    • 在 ssh 会话里pkill -f ssh会连自己的会话一起杀掉
  • 指定信号可用数字-9也可用名字-KILL,脚本里用名字更可读

lsof

  • lsof列出打开的文件,Linux 下"文件"包括普通文件、目录、管道与 socket,所以端口占用也归它管

  • 按端口与网络查:

    console
    $ lsof -i :22                  # 22 端口相关的所有连接
    $ lsof -i TCP -sTCP:LISTEN     # 所有 TCP 监听
    $ lsof -i -P -n                # 禁用端口与主机名解析,快很多
    
  • 其它维度:-p PID某进程打开的全部文件、-u user某用户、+D /path目录下被打开的文件

  • 经典场景:

    • umount报target is busy:lsof +D 挂载点揪出占用者
    • 磁盘满了但du找不到大文件:lsof | rg deleted,文件已删但进程还握着句柄,空间不释放,重启对应进程即可
    • 只取 PID 用于脚本:kill -9 $(lsof -t -i:8080),-t只输出 PID
  • fuser是同功能的另一把刀:fuser -v 8080/tcp看占用某端口的进程

优先级与后台

  • nice 值范围-20(最高)到19(最低),默认0:
    • 普通用户只能降低优先级(数值调大),负值需要 root
    • 启动时指定:nice -n 10 命令,运行中调整:renice -n 5 -p PID
  • 后台运行与脱离终端:
    • 命令 &挂后台,jobs、fg、bg管理,退出登录时会收到SIGHUP
    • nohup 命令 &让进程免疫挂断信号,输出默认进nohup.out
    • setsid开新会话彻底脱离终端,disown把已在跑的作业移出挂断名单
  • 长期任务推荐直接写成 systemd 服务或 timer,交给systemctl托管,见systemd、systemctl 与 journalctl

/proc

  • /proc/PID/是内核暴露的进程档案,ps与top的数据源头就在这里:
    • cmdline:完整命令行,参数以\0分隔:tr '\0' ' ' < /proc/PID/cmdline
    • environ:环境变量,同样\0分隔
    • status:人读的状态汇总,含线程数与上下文切换次数
    • fd/:每个打开的句柄一个符号链接,ls -l /proc/PID/fd
    • limits:文件句柄数等资源上限
  • 数字目录随进程生死增减,配合watch即可做极简监控

相关阅读