起因: 表现情况:在跑任务时出现了僵死情况,任务是晚上9点开始跑的,查看log发现在半夜3点多的时候进入了僵死。
接下来按照大佬的教程,用ps auxf查看我们的进程执行到了哪一步:
可以看到是子进程和信号量都还在,但是子进程上属的父进程没有了,应该是被系统杀掉了导致变成了孤儿进程。
因为子进程上属的父进程已经被杀掉了,所以我们无法根据strace -p $pid 来跟踪被杀的父进程。
因此,我们可以cd /proc/22653/,在这里我们可以查看进程状态。cd /proc/之后,你会发现很多的目录和文件,今天首先来介绍的就是那些以数字命名的目录--它们就是linux中的进程号,每当你创建一个进程时,里面就会动态更新多出一个名称为pid的目录,然后你ls -l /proc/pid会发现如下信息:
根据https://www.linuxidc.com/Linux/2012-09/70975.htm,可以看出里面到底都说明了什么
cmdline:这个主要是当前这个进程被运行时的command line,里面包括了运行时指定的一些参数,比如如果是mysqld的话就包括basedir==,datadir==,port=,socket=等等信息,你可以自己尝试一下。
cwd:current working directory,当前的工作目录
environ:这是个比较有用的文件,里面记录了当前进程的一些环境变量,比如一台机器上对同一个系统起多个实例(当然是不同端口、不同数据目录),而你想知道哪个进程对应的是在哪个数据目录起来的(可能是因为你想kill-9其中一个实例,因为你怕弄错,所以的确定哪个进程是对应哪个数据目录),那么此时你该怎么办呢?两者方法:1.strings /proc/pid/environ | grep PWD 2.tr \\0 \\n < /proc/pid/envrion | grep PWD 即可。当然里面还有很多的信息,你可以自己尝试。
exe:这个就是气这个进程的执行文件
fd:进程打开的文件