背景

前几天在研究线程的时候,看到一句话说java里的线程Thread.run都会在Linux中fork一个的轻量级进程,于是就想验证一下(笔者的机器是Linux的)。当时用top命令的时候,进程总是跳来跳去的,看起来很辛苦,有个工具叫htop,支持filter,感觉也没那么直观。根据在网上查到的资料和man top,整理出了两条语句:

top -p pgrep java | tr "\\n" "," | sed 's/,$//'
top -d 3 -n 100 -b | egrep 'top - | PID | java'

每次手动敲上面的命令比较有点辛苦,于是写了一个shell脚本希望能监听指定进程名的进程变化,这篇文章也由此而来。第一次真正写shell,不足之处望指正,多谢。


思路

  • top命令本身支持动态和静态输出的方式显示进程信息,也支持指定top n个pid,所以这个shell是基于此的。
  • 在支持原始top命令的基础上,我们希望至少有两个功能:
    1、监听指定的进程变化,根据pid监听,动态显示,不会输出到窗口,即只包含当时存在的pid,后续创建的pid是监听不到的;
    2、监听指定进程名的变化,跟进程名关键字定时获取新的进程id集合,这个是静态显示,输出到窗口。

实现

#!/bin/bash
#Author:array7
#Create Time:2015-07-19 04:18:58
#Use: topx para1 para2
#       para1: process name(Fuzzy support)
#       para2: output times, mean re-run top command times
#
#Demo: 
#       demo1. topx java:equal to "top -p 123,321,111".These pids' process name contain "java".
#       demo2. topx java 100: base demo 1,but output the newly result to screen for 100 times.  
if test -z "$1"
then
top
else if test -z "$2"
then
pids=`pgrep $1 | tr "\\n" "," | sed 's/,$//'`
if test -z "$pids"
then
echo "Error:can not found pid of process \"${1}\""
exit 0
fi
top -p $pids
else
eval "top -d 3 -n $2 -b | egrep 'top - | PID | $1'"
fi
fi

demo

  1. 例子支持模糊进程名,比如:mysqld,可以使用mysq
  2. 找出线程名为java的当前已经存在的PID变化:
    topx java
  3. 找出线程名为java所有PID的变化,包含新创建的PID,并输出100次:
    topx java 100

版权声明:本文为博主原创文章,未经博主允许不得转载。