如何识别Linux服务器长时间运行进程及编写对应Shell脚本
刚好之前处理过类似的需求,我来给你详细讲讲怎么识别Linux上长时间运行的进程,以及如何写脚本自动筛选运行超一天的进程~
识别Linux服务器上长时间运行进程的方法及脚本实现
一、手动快速排查长时间运行进程
想要手动找长时间跑的进程,ps命令是你的最佳工具,我常用的组合是:
ps -eo pid,ppid,comm,user,etime --sort=-etime
这里的参数分别对应:
pid: 进程ID(方便后续操作)ppid: 父进程ID(能帮你理清进程关系)comm: 进程名称(一眼知道是什么程序)user: 运行进程的用户(排查权限问题有用)etime: 进程已运行的时长(格式很关键:dd-hh:mm:ss代表跑了几天几小时,不足一天的话就显示hh:mm:ss,更短的就是mm:ss)
加个--sort=-etime能让最久的进程排在最前面,扫一眼就找到目标。
如果只想快速筛出跑了超过一天的,直接用grep抓带-的行就行(只有超过一天的etime才会有天数和小时的分隔符-):
ps -eo pid,ppid,comm,user,etime | grep '-'
二、写个Shell脚本自动筛选
手动查毕竟麻烦,写个脚本就能一键搞定,下面是我常用的版本,输出清晰还能处理不同的时长格式:
#!/bin/bash # 筛选运行时长超过1天的进程并格式化输出 echo "=== 运行时长超过1天的进程列表 ===" echo "PID | 父进程ID | 进程名称 | 运行用户 | 运行时长" echo "--------------------------------------------" ps -eo pid,ppid,comm,user,etime | awk ' BEGIN { OFS = " | " # 设置输出分隔符,让格式更整齐 } NR > 1 { # 跳过ps输出的表头行 # 拆分etime字段:如果是dd-hh:mm:ss格式,split后会得到2个元素 split($5, time_parts, "-") if (length(time_parts) == 2) { # 这里的time_parts[1]就是天数,只要>=1就符合条件 print $1, $2, $3, $4, $5 } }'
怎么用这个脚本?
- 把上面的内容存成
long_running_check.sh - 给脚本加执行权限:
chmod +x long_running_check.sh - 直接运行:
./long_running_check.sh
进阶优化:让时长更易读
如果觉得dd-hh:mm:ss不够直观,还可以把脚本改成输出中文的时长描述,比如把2-03:15:40变成2天3小时15分40秒,修改后的awk部分如下:
ps -eo pid,ppid,comm,user,etime | awk ' BEGIN { OFS = " | " } NR > 1 { split($5, time_parts, "-") if (length(time_parts) == 2) { days = time_parts[1] # 拆分时分秒部分 split(time_parts[2], hms, ":") hours = hms[1] mins = hms[2] secs = hms[3] duration = days "天" hours "小时" mins "分" secs "秒" print $1, $2, $3, $4, duration } }'
这样输出的信息就更友好了,不用再自己换算时长~
内容的提问来源于stack exchange,提问作者ganesh_patil
相关产品推荐
相关产品推荐

