Python测试进阶——(6)Bash脚本启动Python监控程序并传递PID
用HiBench执行Hadoop——Sort测试用例,进入 /HiBench-master/bin/workloads/micro/sort/hadoop 目录下,执行命令:
[root@node1 hadoop]# ./run.sh
执行后返回如下信息:
[root@node1 hadoop]# ./run.sh patching args= #enter_bench() Parsing conf: /home/cf/app/HiBench-master/conf/hadoop.conf Parsing conf: /home/cf/app/HiBench-master/conf/hibench.conf Parsing conf: /home/cf/app/HiBench-master/conf/spark.conf Parsing conf: /home/cf/app/HiBench-master/conf/workloads/micro/sort.conf probe -.cdh5./lib/hadoop/../../jars/hadoop-mapreduce-client-jobclient--cdh5.14.2-tests.jar start HadoopSort bench hdfs -.cdh5./bin/hadoop --config /etc/hadoop/conf.cloudera.yarn fs -rm -r -skipTrash hdfs://node1:8020/HiBench/Sort/Output Deleted hdfs://node1:8020/HiBench/Sort/Output #rmr_hdfs() hdfs -.cdh5./bin/hadoop --config /etc/hadoop/conf.cloudera.yarn fs -du -s hdfs://node1:8020/HiBench/Sort/Input Submit MapReduce Job: /opt/cloudera/parcels/CDH--.cdh5./bin/hadoop --config /etc/hadoop/conf.cloudera.yarn jar /opt/cloudera/parcels/CDH--.cdh5./lib/hadoop/../../jars/hadoop-mapreduce-examples--cdh5. hdfs://node1:8020/HiBench/Sort/Input hdfs://node1:8020/HiBench/Sort/Output #run_hadoop_job() The job took seconds. finish HadoopSort bench
发现HiBench执行Python监控程序脚本的命令为:
UID PID PPID C STIME TTY TIME CMD root : pts/ :: python2 /home/cf/app/HiBench-master/bin/functions/monitor.py HadoopSort /home/cf/app/HiBench-master/report/sort/hadoop/conf/../monitor.log /home/cf/app/H root : pts/ :: python2 /home/cf/app/HiBench-master/bin/functions/execute_with_log.py /home/cf/app/HiBench-master/report/sort/hadoop/conf/../bench.log /opt/cloudera/parcels/CD
查看文件run.sh的内容:
current_dir=`dirname "$0"`
current_dir=`cd "$current_dir"; pwd`
root_dir=${current_dir}/../../../../../
workload_config=${root_dir}/conf/workloads/micro/sort.conf
. "${root_dir}/bin/functions/load_bench_config.sh"
enter_bench HadoopSort ${workload_config} ${current_dir}
show_bannar start
rmr_hdfs $OUTPUT_HDFS || true
SIZE=`dir_size $INPUT_HDFS`
START_TIME=`timestamp`
run_hadoop_job ${HADOOP_EXAMPLES_JAR} sort -outKey org.apache.hadoop.io.Text -outValue org.apache.hadoop.io.Text -r ${NUM_REDS} ${INPUT_HDFS} ${OUTPUT_HDFS}
END_TIME=`timestamp`
gen_report ${START_TIME} ${END_TIME} ${SIZE}
show_bannar finish
leave_bench
在文件run.sh中,发现 run_hadoop_job() 调用了 start_monitor 方法:
function run_hadoop_job(){
ENABLE_MONITOR=
if [ "$1" = "--without-monitor" ]; then
ENABLE_MONITOR=
fi
local job_jar=$
shift
local job_name=$
shift
local tail_arguments=$@
local CMD="${HADOOP_EXECUTABLE} --config ${HADOOP_CONF_DIR} jar $job_jar $job_name $tail_arguments"
echo -e "${BGreen}Submit MapReduce Job: ${Green}$CMD${Color_Off}"
]; then
MONITOR_PID=`start_monitor`
fi
execute_withlog ${CMD}
result=$?
]; then
stop_monitor ${MONITOR_PID}
fi
]; then
echo -e "${BRed}ERROR${Color_Off}: Hadoop job ${BYellow}${job_jar} ${job_name}${Color_Off} failed to run successfully."
echo -e "${BBlue}Hint${Color_Off}: You can goto ${BYellow}${WORKLOAD_RESULT_FOLDER}/bench.log${Color_Off} to check for detailed log.\nOpening log tail for you:\n"
tail ${WORKLOAD_RESULT_FOLDER}/bench.log
exit $result
fi
}
查看 start_monitor 方法的定义:
function start_monitor(){
MONITOR_PID=`${workload_func_bin}/monitor.py ${HIBENCH_CUR_WORKLOAD_NAME} $$ ${WORKLOAD_RESULT_FOLDER}/monitor.log ${WORKLOAD_RESULT_FOLDER}/bench.log ${WORKLOAD_RESULT_FOLDER}/monitor.html ${SLAVES} &`
# echo "start monitor, got child pid:${MONITOR_PID}" > /dev/stderr
echo ${MONITOR_PID}
}
还有 stop_monitor 方法的定义:
function stop_monitor(){
MONITOR_PID=$
assert $ "monitor pid missing"
# echo "stop monitor, kill ${MONITOR_PID}" > /dev/stderr
kill ${MONITOR_PID}
}
以及 execute_withlog 方法的定义:
function execute_withlog () {
CMD="$@"
] ; then # Terminal, beautify the output.
${workload_func_bin}/execute_with_log.py ${WORKLOAD_RESULT_FOLDER}/bench.log $CMD
else # pipe, do nothing.
$CMD
fi
}
在 run.sh 中加入以下三行:
echo "PID of this script: $$" echo "PPID of this script: $PPID" echo "UID of this script: $UID"
文件的部分内容如下:
SIZE=`dir_size $INPUT_HDFS`
START_TIME=`timestamp`
run_hadoop_job ${HADOOP_EXAMPLES_JAR} sort -outKey org.apache.hadoop.io.Text -outValue org.apache.hadoop.io.Text -r ${NUM_REDS} ${INPUT_HDFS} ${OUTPUT_HDFS}
echo "PID of this script: $$"
echo "PPID of this script: $PPID"
echo "UID of this script: $UID"
END_TIME=`timestamp`
gen_report ${START_TIME} ${END_TIME} ${SIZE}
show_bannar finish
leave_bench
执行后返回如下信息:
PID of this script: PPID of this script: UID of this script:
用 ps -ef 查看发现 18804 和 32331 分别对应如下进程:
UID PID PPID C STIME TTY TIME CMD root : pts/ :: -bash root : pts/ :: /bin/bash ./run_bak.sh
经查找,发现:
在bash中,子shell进程的PID存储在一个特殊的变量\$\$中。这个变量只读,你不可以在脚本中修改它。除了\$\$, bash shell还会导出其他的只读变量。比如,\$PPID存储子shell父进程的ID(也就是主shell)。\$UID存储了执行这个脚本的当前用户ID。上面输出中,PID每次执行都会变化。这个因为每次运行都会创建一个新的shell。另一方面,PPID每次都会一样只要你在同一个shell中运行。
分析 monitor.py 发现如下方法调用:
pid=os.fork()
分析 execute_with_log.py 发现如下方法调用:
proc = subprocess.Popen(" ".join(command_lines), shell=True, bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
经过思考,利用 subprocess.Popen( ) 方法启动子进程并获取子进程返回值,子进程利用 \$\$ 变量获取PID并作为返回值传递给父进程,父进程可以启动监控程序记录子进程的运行数据。
参考:
https://www.jb51.net/article/62370.htm
https://www.cnblogs.com/ratels/p/11039813.html
https://www.cnblogs.com/ratels/p/11070615.html
https://www.cnblogs.com/zhoug2020/p/5079407.html
Python测试进阶——(6)Bash脚本启动Python监控程序并传递PID的更多相关文章
- Python测试进阶——(7)动手编写Bash脚本启动Python监控程序并传递PID
如下: #./cf_workload_functions.sh function timestamp(){ # get current timestamp sec=`date +%s` nanosec ...
- Python测试进阶——(3)编写Python程序监控计算机的服务是否正常运行
用python写了个简单的监控进程的脚本,当发现进程消失的时候,立即调用服务,开启服务. 脚本的工作原理是这样的:脚本读取配置文件,读取预先配置好的调用系统服务的路径和所要监控的服务在进程管理器中的进 ...
- Python测试进阶——(1)安装Python测试相关模块
安装python 安装pip yum -y install epel-release yum -y install python-pip 安装psutil 参考:https://www.cnblogs ...
- Python测试进阶——(4)Python程序监控、存储、分析并可视化CPU和内存利用率
monitor190617.py 监控cpu和内存利用率信息,组织成json格式,并写入到 record.txt 文件中: import psutil import time import json ...
- 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库
我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...
- Python测试进阶——(5)Python程序监控指定进程的CPU和内存利用率
用Python写了个简单的监控进程的脚本monitor190620.py,记录进程的CPU利用率和内存利用率到文件pid.csv中,分析进程运行数据用图表展示. 脚本的工作原理是这样的:脚本读取配置文 ...
- Python测试进阶——(2)配置PyCharm远程调试环境
新建一个Python项目 配置Deployment,用于本地文件和远程文件的同步,在pycharm的菜单栏依次找到:Tools > Deployment > Configuration 点 ...
- python 测试框架nose
python测试框架nose nose不是python自带模块,这里我才用pip的方式安装 pip install nose 这样就完成了安装,然后再确认下是否安装成功了,直接打开cmd输入noset ...
- Appium环境的安装与配置,Python测试脚本测试
Appium自动化测试系列1 - Appium环境的安装与配置 发表于4个月前(2015-01-27 14:34) 阅读(803) | 评论(0) 0人收藏此文章, 我要收藏 赞0 寻找 会’偷懒 ...
随机推荐
- leetCode练题——9. Palindrome Number
1.题目 9. Palindrome Number Determine whether an integer is a palindrome. An integer is a palindrome ...
- vs下载为0的问题
问题描述:win10 下无法安装VS2017,visual studio installer下载进度始终为0,点击取消按钮后,也没有反应,visual studio installer也关闭不掉: 具 ...
- PAT甲级2019冬季考试题解
A Good In C纯模拟题,用string数组读入数据,注意单词数量的判断 #include<bits/stdc++.h> using namespace std; ; ][]; in ...
- Mybatis的三种批量操作数据的方法
方法1: 使用for循环在java代码中insert (不推荐) 方法2: 使用 在Mapper.xml当中使用 foreach循环的方式进行insert PersonDao.java文件 publi ...
- 1007 Maximum Subsequence Sum (25分) 求最大连续区间和
1007 Maximum Subsequence Sum (25分) Given a sequence of K integers { N1, N2, ..., NK }. A ...
- Python学习笔记005
if if == : xxxx elif : xxxx else: xxxx 输入字符串 input() 字符串转数值 int() 数值转字符串 str() 输出 print() ...
- HDU 5587:Array
Array Accepts: 118 Submissions: 232 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/ ...
- Spark教程——(9)Oozie编排Spark任务
进入Hue管理界面,打开Oozie Editor: 将打包好的Spark程序上传到HDFS上,拖拽Spark任务,编辑任务属性,选择打包好的Spark程序,设置主函数所在类,设置选项参数: 保存为任务 ...
- Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)D(树状数组)
//树状数组中数组的特性,有更巧妙的方法.//我们知道在树状数组中,对于数组tree[i],它所维护的区间为[i−lowbit(i)+1,i]//所以对于tree[2^i],它所维护的区间就为[1,2 ...
- 丰田开放混动专利后,真能PK赢纯电动汽车吗?
特斯拉已成为美国汽车市场增速最快的厂商,且在中国建设工厂后又巩固了自身的地位:蔚来.小鹏等互联网造车企业迅速崛起,吸引着风投的强烈关注:全球范围内,纯电动汽车的销量节节攀升--从多个维度看,纯电动汽车 ...