You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查进程运行状态及识别I/O或文件锁阻塞的脚本实例

如何检查进程运行状态及识别I/O或文件锁阻塞的脚本实例

嗨,针对你遇到的“两个脚本实例,想找出哪个被I/O或文件锁阻塞”的问题,我给你整理了几个实用的命令和排查步骤,一步步来就能定位问题:

第一步:先拿到进程PID,看基础状态

首先你得先把两个脚本实例的PID揪出来,用这个命令就行:

ps -ef | grep <你的脚本文件名>

拿到两个PID后,用下面的命令查看它们的核心状态:

ps -o pid,stat,cmd -p <PID1> <PID2>

重点看stat列的状态码:

  • D:这是「不可中断睡眠状态」,基本实锤进程卡在I/O等待上了(比如磁盘读写、网络存储I/O),这种状态下进程没法被信号打断,只能等I/O完成。
  • S:可中断睡眠,一般是等信号或者普通休眠,不是I/O阻塞的情况。
  • R:正在运行或者就绪状态,说明这个进程正常在跑。

第二步:深入排查I/O阻塞的细节

如果看到某个进程是D状态,想要确认它的I/O情况,用这几个工具:

  • pidstat实时监控:执行下面的命令,每隔1秒刷新一次进程的I/O统计:
    pidstat -d 1 -p <目标PID>
    
    看输出里的kB_rd/s(每秒读字节数)、kB_wr/s(每秒写字节数),如果这些数值持续有数据但进程没进展,或者%util(I/O使用率)很高,那肯定是卡在I/O上了。
  • 查看/proc文件系统的细节:Linux的/proc目录里存着进程的所有细节,比如:
    • 看进程状态:cat /proc/<PID>/status,里面的State字段会明确说明进程是否在D状态。
    • 看累计I/O量:cat /proc/<PID>/io,对比两个进程的rchar(累计读字节)、wchar(累计写字节),能看出哪个进程一直在进行I/O操作却没完成。

第三步:排查文件锁导致的阻塞

如果怀疑是文件锁卡住了进程,用这几个命令:

  • lsof看进程持有的文件:执行lsof -p <PID>,查看这个进程打开的所有文件,重点找TYPE为REG(普通文件)的条目,看有没有LOCKED标记,结合脚本的业务逻辑(比如是不是在读写同一个文件)来判断。
  • lslocks列出系统所有文件锁:直接执行lslocks,在输出里找对应脚本的PID,看它持有或者等待的锁类型(比如FLOCK是文件锁,POSIX是POSIX锁),如果某个进程的锁状态是PENDING,说明它在等待另一个进程释放锁。
  • fuser检查文件的进程占用:如果知道脚本可能在操作某个特定文件,用这个命令:
    fuser -v <可疑文件的绝对路径>
    
    它会显示哪些进程在访问这个文件,以及访问模式(r读、w写),如果有进程在等待锁,也能从输出里间接推断出来。

最后给个小提示:如果两个进程都是D状态,那可能是它们都在等同一个I/O资源(比如磁盘故障、网络存储掉线),这时候得先检查存储设备或者网络连接是否正常。

备注:内容来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:33:12