点击(此处)折叠或打开
- #!/bin/sh
- #程序描述:查询进程间,父子进程,相互调用信息
- #作者: 程晓鹏
- #日期: 2016.12.06
- ps_exe_cmd="ps -ef";
- print_column_spliter="\t"; #打印列分隔符
- #查询字符串长度
- #参数1: 查询的字符串
- function QueryStrLen
- {
- v_input="$1";
- v_result=`echo "${#v_input}" | awk '{print int($0)}'`;
- echo "$v_result";
- }
- #获取子字符串
- #参数1:原始字符串
- #参数2:开始的位置(从1开始)
- #参数3:长度
- function getSubStr
- {
- v_result=""; #返回值
- v_input="$1";
- v_idx="$2";
- v_len="$3";
-
- v_result=`echo "${v_input}" | awk '{print substr($0, vv_idx, vv_len)}' vv_idx=${v_idx} vv_len=${v_len}`;
- echo "$v_result"
- }
- #查询索引值
- #参数1:要查询的原始字符串
- #参数2:查询的关键字
- #返回值:0:代表没有搜索到;大于0,代表搜索到的索引值
- function queryIndex
- {
- v_result=0; #返回值
- v_str="$1";
- v_key="$2";
- v_str_len=$(QueryStrLen "${v_str}");
- v_key_len=$(QueryStrLen "${v_key}");
- if [ $v_str_len -gt 0 ] && [ $v_key_len -gt 0 ]; then
- v_result=`echo "${v_str}" | awk '{print index($0, q_key)}' q_key=${v_key}`;
- fi;
- echo $v_result;
- }
- #查询进程ID
- #参数1:字符串
- function queryProcessID
- {
- v_result=""; #返回结果
- v_input="$1";
- v_result=`echo ${v_input} | awk '{print $2}'`;
- echo "$v_result";
- }
- #查询父进程ID
- #参数1:字符串
- function queryPProcessID
- {
- v_result=""; #返回结果
- v_input="$1";
- v_result=`echo ${v_input} | awk '{print $3}'`;
- echo "$v_result";
- }
- #查询进程用户
- #参数1:字符串
- function queryProcessUser
- {
- v_result=""; #返回结果
- v_input="$1";
- v_result=`echo ${v_input} | awk '{print $1}'`;
- echo "$v_result";
- }
- #查询进程名称
- #参数1:要查找的字符串
- #参数2:查询的关键字
- function queryProcessName_exec
- {
- v_result=""; #返回结果
- v_input="${1}";
- v_key="${2}";
- v_input_len=$(QueryStrLen "${v_input}");
- v_idx=$(queryIndex "${v_input}" "${v_key}");
- if [ v_idx -gt 0 ]; then
- v_len=`expr "$v_input_len" - "$v_idx" + 1 | bc`;
- v_result=$(getSubStr "${v_input}" "$v_idx" "$v_len");
- fi;
- echo "${v_result}";
- }
- #获取进程名称
- #参数1:字符串
- function queryProcessName
- {
- v_result=""; #返回结果
- v_input="$1";
- v_exe_name=`echo "${v_input}" | awk '{print $8}'`; #查询进程名称,开始字符串
- v_len=$(QueryStrLen "${v_exe_name}");
- if [ $v_len -gt 0 ]; then
- v_result=$(queryProcessName_exec "${v_input}" "${v_exe_name}");
- fi;
- echo "${v_result}";
- }
- #清除所有空格
- #参数1:所有字符串
- function CleanSpace
- {
- v_in_str="$1";
- echo "$v_in_str" | sed s/[[:space:]]//g;
- }
- #打印输出信息头
- function PrintHead
- {
- column_1="user";
- column_2="pid";
- column_3="ppid";
- column_4="cmd";
- col_char="$print_column_spliter"; #列分隔符
- echo "${column_1}${col_char}${column_2}${col_char}${column_3}${col_char}${column_4}";
- }
- #打印数据
- #参数1: 字符串
- function PrintItem
- {
- line="$1"; #入参数据
- q_user=$(queryProcessUser "$line");
- q_pid=$(queryProcessID "$line");
- q_ppid=$(queryPProcessID "$line");
- q_pname=$(queryProcessName "$line");
- col_char=${print_column_spliter}; #列分隔符
- echo "${q_user}${col_char}${q_pid}${col_char}${q_ppid}${col_char}${q_pname}";
- }
- #获取子进程
- #参数1:进程ID
- function queryChildInfo
- {
- pid="$1"; #进程ID
- query_result=`${ps_exe_cmd} | grep -v grep | awk '{if($3==q_key){print $0}}' q_key=$pid`; #根据父进程ID,进行搜索
- v_len_size=$(QueryStrLen "$query_result");
- if [ $v_len_size -gt 0 ]; then
- echo "$query_result" | while read line
- do
- out=$(PrintItem "${line}");
- echo "${out}";
- q_pid=$(queryProcessID "${line}"); #获取进程ID
- queryChildInfo "$q_pid"; #进行递归调用
- done;
- fi;
- }
- #获取父进程
- #参数1:进程ID
- function queryParentInfo
- {
- pid="$1"; #进程ID
- query_result=`${ps_exe_cmd} | grep -v grep | awk '{if($2==q_key){print $0}}' q_key=$pid`; #根据进程ID,进行搜索
- v_len_size=$(QueryStrLen "$query_result");
- if [ $v_len_size -gt 0 ]; then
- echo "$query_result" | while read line
- do
- out=$(PrintItem "${line}");
- echo "${out}";
- q_ppid=$(queryPProcessID "${line}"); #获取父进程ID
- queryParentInfo "$q_ppid"; #进行递归调用
- done;
- fi;
- }
- #是否展示,标题头信息
- #参数1:是否打印标题(0:不打印; 1:打印)
- function showTitle
- {
- v_head="$1";
- if [ $v_head -gt 0 ]; then
- PrintHead; #打印信息头
- fi;
- }
- #执行查询(当前进程,及子进程)
- #参数1: 查询结果
- #参数2:是否打印标题(0:不打印; 1:打印)
- function query_run
- {
- query_result="$1";
- v_head="$2";
- v_len_size=$(QueryStrLen "$query_result");
- if [ $v_len_size -gt 0 ]; then
- showTitle "$v_head";
- echo "$query_result" | while read line #循环处理数据
- do
- tmp_line=${line}; #临时变量,递归时调用
- q_pid=$(queryProcessID "${tmp_line}");
- queryChildInfo "$q_pid"; #获取子进程信息
- out=$(PrintItem "${tmp_line}"); #打印当前进程
- echo "${out}";
- done;
- fi;
- }
- #开始执行,进程追踪
- #参数1: 查询结果
- #参数2:是否打印标题(0:不打印; 1:打印)
- function query_parent_run
- {
- query_result="$1";
- v_head="$2";
- v_len_size=$(QueryStrLen "$query_result");
- if [ $v_len_size -gt 0 ]; then
- showTitle "$v_head";
- #处理父进程,相关信息
- echo "$query_result" | while read line #循环处理数据
- do
- out=$(PrintItem "${line}"); #打印当前进程
- echo "${out}";
- q_ppid=$(queryPProcessID "${line}");
- queryParentInfo "$q_ppid"; #获取父进程信息
- done;
- fi;
- }
- #开始追踪,父子进程的,所有关系
- #参数1: 查询结果
- #参数2:是否打印标题(0:不打印; 1:打印)
- function query_all_run
- {
- query_result="$1";
- v_head="$2";
- v_len_size=$(QueryStrLen "$query_result");
- if [ $v_len_size -gt 0 ]; then
- showTitle "$v_head";
- echo "$query_result" | while read line #循环处理数据
- do
- tmp_line=${line}; #临时变量,递归时调用
- tmp2_line=${line}; #临时变量,递归时调用
- q_pid=$(queryProcessID "${tmp_line}");
- queryChildInfo "$q_pid"; #获取子进程信息
- out=$(PrintItem "${tmp_line}"); #打印当前进程
- echo "${out}";
- q_ppid=$(queryPProcessID "${tmp2_line}");
- queryParentInfo "$q_ppid"; #获取父进程信息
- done;
- fi;
- }
- #查询自身进程
- #参数1: 查询结果
- #参数2:是否打印标题(0:不打印; 1:打印)
- function query_self_run
- {
- query_result="$1";
- v_head="$2";
- tmp_result="$1"; #临时变量
- v_len_size=$(QueryStrLen "$query_result");
- if [ $v_len_size -gt 0 ]; then
- showTitle "$v_head";
- #输出进程相关信息
- echo "$tmp_result" | while read line #循环处理数据
- do
- out=$(PrintItem "${line}");
- echo "${out}";
- done;
- fi;
- }
- #根据关键字,进行查询
- #参数1:查询关键字
- #参数2:是否打印标题(0:不打印; 1:打印)
- #参数3:过滤掉的数据
- function query_key
- {
- v_key="$1"; #查询关键字
- v_head="$2";
- v_filter="$3";
- query_result=`${ps_exe_cmd} | grep "${v_key}" | grep -v "${v_filter}" | grep -v grep`;
- query_run "${query_result}" "$v_head";
- }
- #根据进程id,进行查询
- #参数1:进程ID
- #参数2:是否打印标题(0:不打印; 1:打印)
- function query_pid
- {
- p_id="$1"; #进程id
- v_head="$2";
- query_result=`${ps_exe_cmd} | grep -v grep | awk '{if($2==q_key){print $0}}' q_key=$p_id`;
- query_run "${query_result}" "$v_head";
- }
- #通过关键字,追踪进程的调用关系
- #参数1:查询关键字
- #参数2:是否打印标题(0:不打印; 1:打印)
- #参数3:过滤掉的数据
- function query_parent_key
- {
- v_key="$1"; #查询关键字
- v_head="$2";
- v_filter="$3";
- query_result=`${ps_exe_cmd} | grep "${v_key}" | grep -v "${v_filter}" | grep -v grep`;
- query_parent_run "${query_result}" "$v_head";
- }
- #通过进程id,追踪进程的父子进程,关系
- #参数1:进程
- #参数2:是否打印标题(0:不打印; 1:打印)
- function query_parent_pid
- {
- p_id="$1"; #查询关键字
- v_head="$2";
- query_result=`${ps_exe_cmd} | grep -v grep | awk '{if($2==q_key){print $0}}' q_key=$p_id`;
- query_parent_run "${query_result}" "$v_head";
- }
- #通过进程,追踪进程的调用关系
- #参数1:查询关键字
- #参数2:是否打印标题(0:不打印; 1:打印)
- #参数3:过滤掉的数据
- function query_all_key
- {
- v_key="$1"; #查询关键字
- v_head="$2";
- v_filter="$3";
- query_result=`${ps_exe_cmd} | grep "${v_key}" | grep -v "${v_filter}" | grep -v grep`;
- query_all_run "${query_result}" "$v_head";
- }
- #通过进程ID,追踪进程的父子进程,关系
- #参数1:进程ID
- #参数2:是否打印标题(0:不打印; 1:打印)
- function query_all_pid
- {
- p_id="$1"; #查询关键字
- v_head="$2";
- query_result=`${ps_exe_cmd} | grep -v grep | awk '{if($2==q_key){print $0}}' q_key=$p_id`;
- query_all_run "${query_result}" "$v_head";
- }
- #根据关键字,查询自己进程
- #参数1:查询关键字
- #参数2:是否打印标题(0:不打印; 1:打印)
- #参数3:过滤掉的数据
- function query_self_key
- {
- v_key="$1"; #查询关键字
- v_head="$2";
- v_filter="$3";
- query_result=`${ps_exe_cmd} | grep "${v_key}" | grep -v "${v_filter}" | grep -v grep`;
- query_self_run "${query_result}" "$v_head";
- }
- #根据进程ID,查询自己进程
- #参数1:进程ID
- #参数2:是否打印标题(0:不打印; 1:打印)
- function query_self_pid
- {
- p_id="$1"; #查询关键字
- v_head="$2";
- query_result=`${ps_exe_cmd} | grep -v grep | awk '{if($2==q_key){print $0}}' q_key=$p_id`;
- query_self_run "${query_result}" "$v_head";
- }
- #################################################################################################
- #################################################################################################
- #################################################################################################
- #帮助
- #参数1:命令名称
- function help
- {
- v_name="$1";
- echo "${v_name}程序,为方便查询,进程调用关系的程序。核心代码为通过ps命令,通过递归方式,查找其父子进程相关参数信息。
- 执行命令格式为 ${v_name} [-a] [-i] [-p] [-0] [-n] 要查询的参数
- 默认为查询入参的进程及子进程。
- 可选参数如下:
- -a 搜索父子进程调用关系
- -i 通过进程ID(pid),进行搜索
- -p 查询调用的父进程调用关系
- -0 仅查询当前进程
- -n 隐藏标题输出";
- }
- #验证参数
- #参数1:参数集合,字符串
- #参数2:要验证的字符
- #返回值:0:不含有该参数; 1:含有该参数
- function valid_parameter
- {
- v_result=0;
- v_str=`echo "$1" | tr '[A-Z]' '[a-z]'`;
- v_key=`echo "$2" | tr '[A-Z]' '[a-z]'`;
- v_idx=$(queryIndex "${v_str}" "${v_key}");
- if [ $v_idx -gt 0 ]; then
- v_result=1;
- fi;
- echo $v_result;
- }
- #开始运行(参数:a)
- #参数1:是否通过,进程id,进行查询
- #参数2:是否输出标题
- #参数3:查询关键字
- #参数4:需要过滤的关键字
- function run_a
- {
- v_pid="$1";
- v_title="$2";
- v_key="$3";
- v_filter="$4";
- if [ $v_pid -gt 0 ]; then
- query_all_pid "${v_key}" "$v_title";
- else
- query_all_key "${v_key}" "$v_title" "${v_filter}";
- fi;
- }
- #开始运行(参数:p)
- #参数1:是否通过,进程id,进行查询
- #参数2:是否输出标题
- #参数3:查询关键字
- #参数4:需要过滤的关键字
- function run_p
- {
- v_pid="$1";
- v_title="$2";
- v_key="$3";
- v_filter="$4";
- if [ $v_pid -gt 0 ]; then
- query_parent_pid "${v_key}" "$v_title";
- else
- query_parent_key "${v_key}" "$v_title" "${v_filter}";
- fi;
- }
- #开始运行(参数:0)
- #参数1:是否通过,进程id,进行查询
- #参数2:是否输出标题
- #参数3:查询关键字
- #参数4:需要过滤的关键字
- function run_0
- {
- v_pid="$1";
- v_title="$2";
- v_key="$3";
- v_filter="$4";
- if [ $v_pid -gt 0 ]; then
- query_self_pid "${v_key}" "$v_title";
- else
- query_self_key "${v_key}" "$v_title" "${v_filter}";
- fi;
- }
- #开始运行(默认输出进程,以及子进程信息)
- #参数1:是否通过,进程id,进行查询
- #参数2:是否输出标题
- #参数3:查询关键字
- #参数4:需要过滤的关键字
- function run_default
- {
- v_pid="$1";
- v_title="$2";
- v_key="$3";
- v_filter="$4";
- if [ $v_pid -gt 0 ]; then
- query_pid "${v_key}" "$v_title";
- else
- query_key "${v_key}" "$v_title" "${v_filter}";
- fi;
- }
- #开始运行
- #参数1:是否执行所有(入参:a)
- #参数2:是否通过pid,进行查询(入参:i)
- #参数3:是否查询父进程相关信息(入参:p)
- #参数4:是否仅查询自己的进程(入参:0)
- #参数5:是否输出标题(入参:n)
- #参数6:查询参数
- #参数7:执行shell的名称
- function run
- {
- v_a="$1";
- v_i="$2";
- v_p="$3";
- v_0="$4";
- v_n="$5";
- v_key="$6";
- v_exe="$7";
- if [ $v_a -gt 0 ]; then
- run_a "$v_i" "$v_n" "${v_key}" "${v_exe}";
- elif [ $v_p -gt 0 ]; then
- run_p "$v_i" "$v_n" "${v_key}" "${v_exe}";
- elif [ $v_0 -gt 0 ]; then
- run_0 "$v_i" "$v_n" "${v_key}" "${v_exe}";
- else
- run_default "$v_i" "$v_n" "${v_key}" "${v_exe}";
- fi;
- }
- exe_name=$0;
- all_paras_str="";
- query_key="";
- v_head=1; #默认输出标题
- if [ $# -gt 0 ]; then
- while [ $# -ne 1 ]
- do
- para_item="$1";
- all_paras_str="${all_paras_str}${para_item}";
- shift;
- done;
-
- query_key="$1";
- #验证入参信息
- valid_a=$(valid_parameter "${all_paras_str}" "a"); #查看关联的,父子进程
- valid_i=$(valid_parameter "${all_paras_str}" "i"); #根据pid,进行查询
- valid_p=$(valid_parameter "${all_paras_str}" "p"); #查看父进程
- valid_0=$(valid_parameter "${all_paras_str}" "0"); #仅查询自己的进程,无关联信息
- valid_n=$(valid_parameter "${all_paras_str}" "n"); #不输出标题
- if [ $valid_n -gt 0 ]; then
- v_head=0; #关闭输出,标题信息
- fi;
- run "$valid_a" "$valid_i" "$valid_p" "$valid_0" "$v_head" "${query_key}" "${exe_name}"; #开始查询
- else
- help "$exe_name";
- fi;
QueryProcessInfo.rar