学习中心/工程实践/Linux/Linux 8:进程挂了,按顺序查

· Linux · 8 · 进程

Linux 8:进程挂了,按顺序查

ps、ss、/proc、journalctl。TERM 在 KILL 前面。有 unit 就 systemctl。

正在加载录音…

挂了先看,再决定动不动手

服务没反应,顺序是:谁在跑、谁占端口、日志说什么、再发信号。这一块走完,你该有方法,而不是一上来 kill -9。

  1. 进程ps / top
  2. 端口ss / lsof
  3. 日志journalctl
  4. 信号TERM → KILL

1. 谁在跑

  • 看
    按名字找。最后一行常是 grep 自己ps aux | grep nginx
  • 看
    只列出匹配的 pid 和命令行pgrep -a nginx
  • 看
    父子关系。杀父进程,子进程往往一起走pstree -p | head

PID 是这一次的编号,重启会变。PPID 是父进程。僵尸进程(Z)已经死了,卡在等父亲收尸,kill 它没有用。

2. 谁在吃机器

  • 看
    load average 三个数:1、5、15 分钟。大约相对 CPU 核数来看uptime
  • 看
    CPU、内存。Shift+P 按 CPU 排,Shift+M 按内存。q 退出top

load 高不一定是 CPU。iowait 高是盘在拖。top 里 wa 一栏。htop 更可读,没有就用 top。

3. /proc 不是普通目录

  • 看
    这个进程打开了哪些文件和套接字。PID 换成你看到的ls /proc/$(pgrep -n nginx)/fd
  • 看
    真实命令行,含被改掉的 argvtr '\0' ' ' < /proc/$(pgrep -n nginx)/cmdline; echo

/proc 是内核把状态暴露成文件。不是磁盘上的文件夹,不要当资料盘来清。

4. 谁占了端口

  • 看
    正在听的 TCP,以及进程。没有进程名就加 sudoss -lntp
  • 看
    谁占着 80。ss 没有时用这个sudo lsof -iTCP:80 -sTCP:LISTEN

端口在听、页面打不开:进程在,问题在防火墙、反代或应用自己。先记下 pid 和侦听地址是 127.0.0.1 还是 0.0.0.0。

5. 信号

  • 停
    请它自己收尾。默认的 kill 就是 TERMkill -TERM PID
  • 停
    很多守护进程会重读配置。nginx -s reload 往往更合适kill -HUP PID
  • 停
    立即结束,来不及收尾。先试 TERM。有 systemd 的用 systemctl stopkill -KILL PID

KILL(-9)内核直接收走,文件可能半写。能 TERM 就 TERM。kill 杀的是一个 pid,pkill 按名字,范围更大,先 pgrep 看会命中谁。

6. 日志

  • 看
    这个服务最近 100 行journalctl -u nginx -n 100 --no-pager
  • 看
    这次开机以来的错误journalctl -u nginx -p err -b --no-pager
  • 看
    有文件日志就看文件。-f 是跟上tail -n 50 /var/log/nginx/error.log

7. 方法

  • 没响应:ps / pgrep → ss 端口 → journalctl 或日志文件 → 再决定 stop 还是 kill。
  • CPU 打满:top 找出进程,看它是在算还是在等锁。
  • 机器慢:uptime 看 load,top 看 wa,df 看盘(排查那一篇)。
  • 有 unit 的服务,优先 systemctl,不要手工杀再留下一个 systemd 去重启它。

这块过关:挂了你有顺序,TERM 在 KILL 前面。下一篇用钥匙登录远程。

同模块

工程实践 →