Linux进程突然被杀掉(OOM killer),查看系统日志

Linux进程突然被杀掉(OOM killer),查看系统日志,第1张

一个命令: 这个命令需要用户处于root权限才能看,执行之后可以看到: 简单说一下: total-vm就是进程使用的虚拟内存大小,其中部分内容映射到RAM本身,也就是主存,被分配和使用也就成了RSS。 部分RSS在实际内存块里面分配,成了anon-rss,叫做匿名内存。还有映射到设备和文件的RSS内存卡,叫做file-rss。 比如说: 你用vim指令打开一个巨大的文件,那么file-rss将会很高。 如果你用malloc()动态分配很大部分的内存,并且真的使用了它,那么anon-rss也会很高。 但是!!如果你使用malloc()分配了大量的内存,但是不去用它!那么total-vm将会变得更高,但是因为内存过量使用,不会使用真正的内存,那么rss值会很低。 可以看到上述信息,发现进程被杀掉了。 那么杀掉它的原因是什么呢? 首先确定,当报出OOM的时候,系统的内存已经不足了,于是linux会决定杀掉进程,但是linux采用的策略并非是杀掉最占用内存的进程(Android是这样)。 linux会给每个进程评分:oom_score 根据这个评分去kill,决定这个分数的因素除了内存占用大小之外,还有内存增加的速率,比如说kylin,当执行Task构建Cube的时候,内存的占用会突然爆发式增长!发现这时候的分数老高了!然后就把它kill了。http://www.wowotech.net/memory_management/oom.html https://stackoverflow.com/questions/18845857/what-does-anon-rss-and-total-vm-mean

kill -9 PID —— 强制杀死一个进程。

1、kill -9 杀死后台运行的进程。

红色下划线:sleep 10000 &—— 后台运行延时 10000 秒的命令,进程 ID 为1317。

黄色下划线:ps —— 列出 1317 sleep 命令的进程。

(PID:进程 ID、PGID:线程组 ID、SID:会话 ID、TTY:进程运行的终端,标识那个终端控制。(pts远程终端、tty系统终端)、TIME:进程运行的时间 和 CMD:命令的名称和参数)。

jobs -l —— 列出后台运行的命令,1317 sleep 命令正在后台运行。

蓝色下划线:kill -9 1317—— 杀死 1317 进程。

绿色方框:ps 查询进程,1317 sleep进程已经被杀死(Killed)。jobs -l 已经没有后台运行的1317 sleep 命令。

2、kill -9 终止挂起的进程。

红色下划线:执行 sleep 10000 后 ctrl + z 挂起。

黄色下划线:ps -j 查看进程,有 1342 sleep 的进程。jobs -l 查看后台,1342 sleep 的状态是 stopped 暂停状态。

蓝色下划线:kill -9 杀死 1342 进程。此时系统没有反馈信息。

绿色下划线:ps -j 查看进程,1342 sleep 已经被杀死(Killed)。jobs -l 查看后台,已经没有了  1342 sleep。

从实验上看:

1、后台命令运行时(Running),执行 kill -9 可以强杀进程。

2、挂起命令,处于暂停状态时(Stopped),执行 kill -9 后通过 ps 查询进程, 可以看到进程已经被杀死。jobs 也查不到有后台命令。(这里和 kill -2、kill -15 不一样。kill -2、kill -15 在挂起命令,处于暂停状态时(Stopped)时执行,通过 ps 还可以查询到进程,jobs 也可以查询到后台仍有处于暂停状态的命令。)

kill -15 PID —— 正常方式终止一个程序。中断进程时应首先用 -15,以便于其能够预先清理临时文件和释放资源。-9 作为最后手段,应对那些失控的进程。

1)、kill -15 终止后台运行的进程。

红色下划线:sleep 10000 &—— 后台运行延时 10000 秒的命令,进程 ID 为1550。

黄色下划线:ps -j —— 列出 1550 sleep 命令的进程。

(PID:进程 ID、PGID:线程组 ID、SID:会话 ID、TTY:进程运行的终端,标识那个终端控制。(pts远程终端、tty系统终端)、TIME:进程运行的时间 和 CMD:命令的名称和参数)。

jobs -l —— 列出后台运行的命令,1550 sleep 命令正在后台运行。

蓝色下划线:kill -15 1550—— 终止1550 进程。系统反馈 Terminated 终止 1550 进程。

绿色方框:ps -j 已查询不到 1550 sleep 的进程。jobs -l 也没有后台运行的命令。

2)、kill -15 配合 fg 查看终止挂起的进程。

红色下划线:sleep 10000 延时 10000 秒后 ctrl + z 挂起。

黄色下划线:ps -j 查看进程,有 1578 sleep 的进程。jobs -l 查看后台,1578 sleep 的状态是 stopped 暂停状态。

蓝色下划线:kill -15 终止 1578 进程。此时系统没有反馈信息。

绿色下划线:ps -j 查看进程,1578 sleep 进程仍在。jobs -l 查看后台,1578 sleep 的状态是 stopped 暂停状态。

红色下划线:fg 1 把后台运行的 sleep 调至前台继续运行。此时,系统首先提示 sleep 已经调至前台运行,然后又提示 Terminated 终止进程。

蓝色下划线:ps -j 查看进程已经没有了 1578 sleep 进程。jobs -j 查看也后台也没有命令在执行。

3)、kill -15 配合 bg 查看终止挂起的进程。

同样的,首先sleep 10000 后 ctrl + z 挂起。通过 ps -j 查看后台进程有 1590 sleep进程,josb -l 查看后台也有状态为 stopped  的1590 sleep 命令。 然后,kill -15 1590 终止 1590 进程。再次通过 ps -j 查看1590 sleep进程仍在,josb -l 查看后台还有状态为 stopped  的1590 sleep 命令。

红色下划线:bg 1 把挂起的 sleep 命令继续运行。此时,系统反馈 sleep 命令在后台运行。

黄色下划线:ps -j 查看进程,系统反馈 sleep 进程已经  Terminated  终止。jobs -l 也查询不到sleep 在后台运行。

从实验上看:

1、后台命令运行时(Running),执行 kill -15 可以终止进程。

2、挂起命令,处于暂停状态时(Stopped),执行 kill -15 后通过 ps 还可以查询到进程, jobs还可以查询到后台命令,状态仍然是 Stopped 暂停状态。用 fg 把暂停的后台进程调至前台运行时,系统反馈一行 sleep 命令调至前台运行。跟着一条 Terminated 终止进程。再用 ps 查询不到进程。用 jobs 已经查询不到后台命令。(这里和 kill -2 不同,kill -2 后用 fg 系统只反馈一行 sleep 命令调至前台运行,没有提示进程已中断。)

3、挂起命令,处于暂停状态时(Stopped),执行 kill -15 后通过 ps 还可以查询到进程, jobs还可以查询到后台命令,状态仍然是 Stopped 暂停状态。用 bg 把暂停的后台命令恢复运行时,系统反馈 sleep 命令在后台运行。再用 ps 查询进程已经终止,用 jobs 已经查询不到后台命令。(这里和 kill -2一样)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7486532.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-06
下一篇2023-04-06

发表评论

登录后才能评论

评论列表(0条)

    保存