You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别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
    }
}'

怎么用这个脚本?

  1. 把上面的内容存成long_running_check.sh
  2. 给脚本加执行权限:
    chmod +x long_running_check.sh
    
  3. 直接运行:
    ./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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:59:24