• Linux 动态监听进程shell


    背景

    前几天在研究线程的时候,看到一句话说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

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

  • 相关阅读:
    并发编程--锁--锁的理解及分类
    String -- 从源码剖析String类
    Spring 抽象的缓存包 spring-cache
    小白学做菜笔记
    使用Lists.partition切分性能优化
    String--常见面试题
    常用的Linux命令
    去除字符串中的空格
    微信小程序切换选中状态
    微信小程序面试题总结
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712899.html
Copyright © 2020-2023  润新知