- 通过top查看这个进程的状态
这个进程的pid是26466,进程状态为S(Sleep),CPU为0.0。进程状态和CPU都暗示我们,当前进程正阻塞在某个系统调用。
这个时候,有一个很好使的命令:strace,可以跟踪进程的所有系统调用,我们来看看
~$ strace -T -tt -e trace=all -p 26466
Process 26466 attached
19:21:34.746019 recvfrom(3,
可以看到,进程卡在了recvfrom这个系统调用,对应的文件描述符(file descriptor)是3,其实通过recvfrom这个名字,大致也能定位问题。
关于文件描述符,还有一个更实用的命令,lsof(list open file),可以看到当前进程打开的所有文件,在linux下,一切皆文件,自然也就包括了socket。
top 看 pid ,cpu使用和是否为sleep状态
strace -T -tt -e trace=all -p 75506
查看对进程的系统调用的跟踪
看到卡在fcntl()函数,文件描述符为3
lsof -p 75506|grep 3u
使用文件描述符查找到文件
那个fcntl函数 最后就一直没有输出个 =0 或者什么值?
正常的话就要输出 =0 了
(对比了本地ten服务器上的输出)
lsof | grep /var/lib/rpm/.dbenv.lock
定位卡主的这个文件被哪些程序占用了
应该杀掉没有用的占用了那个文件锁的process
那幅图显示的都是yum命令,第二列是pid,你可以在刚才的命令后面追加一个管道 "|awk '{print $2}'|xargs kill -9" 杀掉那些一直卡住的 yum 命令
确保没有无用程序占用那个锁文件就可以了
前一个yum还没执行完又不停地启动新的yum,最后就卡在那个锁文件了。