如何检查进程运行状态及识别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
相关产品推荐
相关产品推荐

