监测程序运行的Shell脚本

 

这篇博客整理一个在Linux服务器上通过进程名来监测程序是否执行的脚本,然后根据程序是否执行来进行其他的一些操作,这对在服务器上跑程序,然后自动化执行某些操作还是非常方便的.

这篇博客整理一个在Linux服务器上通过进程名来监测程序是否执行的脚本,然后根据程序是否执行来进行其他的一些操作,这对在服务器上跑程序,然后自动化执行某些操作还是非常方便的.

在前面Fortran + Gnu 批量计算这篇博客中,虽然可以批量的进行fortran程序的编译和执行,在程序执行完成之后再批量的进行gnuplot绘图,这里的缺陷就是必须人为的取查看前面编译的fortran程序是否已经执行完毕,谁也不会准确的指导自己的程序何时会在服务器上执行完毕,那么就可以通过一个脚本让服务器自行监测程序的运行,当fortran程序执行完毕之后,接下来就可以让服务器再自行启动gnuplot的绘图程序.

程序监测

这篇博客的脚本其实也就是对Fortran + Gnu 批量计算这篇博客的一个缺陷补充,但是监测程序修改一下同样可以监测别的东西,所以就单独整理了出来.

  • 初级版
    #!/bin/bash
    while :
    do 
      sleep  10m # 每10分钟进行一次监测
      COUNT=$(ps -ef |grep "out" |grep -v "grep" |wc -l) # 从进程中查看out结尾的程序数目
      echo $COUNT>>mes.dat  # 打印进程中out结尾的数量
      if [ $COUNT -eq 0 ];then
          echo Not running  >>  mes.dat # 如果out结尾进程数量不为零,则执行这一项
          sh auto-plot-fold.sh &
          exit 0
      else
          echo Is Run >>  mes.dat   # 如果out结尾进程数量为零,则执行这一项	
          #ps -ef|grep "monitor.sh">>mes.dat	
          echo "ID:">>mes.dat
          ps -ef | grep "out" | grep -v grep | awk '{print "ID:" $2 "   Time:" $7}'>>mes.dat
          # exit 0
      fi
    done
    
  • 完善版
#!/bin/bash
rm mes.dat
while :
do 
	conut=$(ps -ef |grep "out" |grep -v "grep" |wc -l) # 从进程中查看out结尾的程序数目
	echo ID_Number: $conut>>mes.dat  # 打印进程中out结尾的数量
	current_time="`date +"%Y-%m-%d %H-%M-%S"`" #获取系统当前时间
	if [ $conut -eq 0 ];then
		echo current_time:$current_time >> mes.dat
		#echo Not running  >>  mes.dat # 如果out结尾进程数量不为零,则执行这一项
		sh auto-plot-fold.sh &
		exit 0
	else
		echo current_time:$current_time >> mes.dat
		echo $conut processing is running >>  mes.dat   # 如果out结尾进程数量为零,则执行这一项	
		#ps -ef|grep "monitor.sh">>mes.dat	
		ps -ef | grep "out" | grep -v grep | awk '{print "ID:" $2 "   Time used:" $7}'>>mes.dat
		# exit 0
		echo -e "\n" >> mes.dat
	fi
	sleep  10m # 每10分钟进行一次监测
done

代码解释

这里用了一个无限循环,每10分钟进行一次监测

sleep  10m # 每10分钟进行一次监测

接下来进行进程识别

COUNT=$(ps -ef |grep "out" |grep -v "grep" |wc -l) # 从进程中查看out结尾的程序数目

这一行代码主要是在进程中ps -ef提取以out结尾的进程grep “out”,然后统计了这种名称的进程的数目wc -l,这里面会涉及到一些基本的shell的语法,看不懂请自行补充知识,我就不去介绍了.

接下来就进行判断,因为我在对fortran程序批量编译执行的时候,就已经将所有的执行文件都已out结尾,所以上面在识别进程的时候才可以只关注out结尾的进程

if [ $COUNT -eq 0 ];then

如果统计的进程数量等于0,说明此时所有的程序都已经执行完毕,就可以让服务器进行绘图程序启动了

echo Not running  >>  mes.dat # 将一些信息追加到mes.dat这个文件中
sh auto-plot-fold.sh &  # 启动绘图程序
exit 0 # 退出无限循环

在启动了绘图程序之后,就不必在进行监测了,可以退出循环.

如果这种进程的数量不为0,那么此时所有的程序还没有执行完毕,那么向mes.dat中写入一些信息,方便我们去查看

echo Is Run >>  mes.dat   # 如果out结尾进程数量为零,则执行这一项	
#ps -ef|grep "monitor.sh">>mes.dat	
echo "ID:">>mes.dat
ps -ef | grep "out" | grep -v grep | awk '{print "ID:" $2 "   Time:" $7}'>>mes.dat
# exit 0

以上就是整个代码的解释.

这里有一点需要注意,因为是在执行shell脚本,此时同样可以让这个脚本在后台自动执行,假设这个脚本名为monitor.sh,那么需要利用 nohup sh monitor.sh &来提交任务,这样即使我们退出了终端,那么这个任务也会在后台自动执行.

升级版

#!/bin/sh  
#============ get the file name ===========  
rm *.gnu *.png no* *.dat *.out 1>/dev/null 2>/dev/null mes.dat &
Folder_A=$(pwd) 
for file_a in ${Folder_A}/*.f90
do 
	temp_file=`basename $file_a  .f90` 
	ifort -mkl -O3 -CB $file_a -o $temp_file.out 
    nohup ./$temp_file.out 1>/dev/null 2>/dev/null &
done

while :
do 
	sleep  10 # 每10秒钟进行一次监测
	conut=$(ps -ef |grep "out" |grep -v "grep" |wc -l) # 从进程中查看out结尾的程序数目
	echo ID_Number: $conut>>mes.dat  # 打印进程中out结尾的数量
	current_time="`date +"%Y-%m-%d %H-%M-%S"`"
	if [ $conut -eq 0 ];then
		echo current_time:$current_time >> mes.dat
		#echo Not running  >>  mes.dat # 如果out结尾进程数量不为零,则执行这一项
		# 程序执行完毕开始绘图
		Folder_A=$(pwd) 
		for file_a in ${Folder_A}/*.gnu
		do 
			gnuplot $file_a  1>/dev/null 2>/dev/null &
		done
		exit 0 # 绘图结束后退出死循环
	else
		echo current_time:$current_time >> mes.dat
		echo $conut processing is running >>  mes.dat   # 如果out结尾进程数量为零,则执行这一项	
		#ps -ef|grep "monitor.sh">>mes.dat	
		ps -ef | grep "out" | grep -v grep | awk '{print "ID:" $2 "   Time used:" $7}'>>mes.dat
		# exit 0
		echo -e "\n" >> mes.dat
	fi
done

这里把绘图与程序编译执行放在了一起,如果在编写fortran程序的时候,同时对相应的数据写出对应的gnuplot绘图代码,那么可以利用这个程序将程序编译执行和作图一起完成,这样可以节省很多时间.

公众号

相关内容均会在公众号进行同步,若对该Blog感兴趣,欢迎关注微信公众号。

png