|
经常在linux下运行程序,有时不得不需要一些辅助的判定方法。比如,监控进程是否存活,定时发送数据其他数据源,等等等等。
其实,如果能巧用bash,很多工作可以做的很轻松。不过bash对我而言,我其实还不算会用的,只是有些技巧本人觉得比较具有通用性,在这里记录一下。
经常用到的是监控某一个进程的状态。并根据状态决定是否杀死当前进程。- #!/bin/bash
- function proc_check() {#检测某一个路径中启动的进程状态
- ps -fe |grep /program/Test/ |grep nobody |awk '{print $2}' >> aasnow.txt
- cat aasnow.txt | while read line;
- do#判断当前进程的file IO是否超过指定额度,超过就杀死进程
- lsof -p $line|wc -l >> assio.txt
- cat assio.txt | while read IOCount;
- do
- echo $line - $IOCount
- if [ $IOCount -ge 1000 ]
- then
- kill -9 $line
- echo $(date)-PID=$line-IOCOUNT=$IOCount is close >> check_process.log
- fi
- done
- rm -rf assio.txt
- done
- rm -rf aasnow.txt
- }
- #!/bin/sh
- while true
- do
- proc_check#每隔3秒钟执行一次
- sleep 3
- done
复制代码
以上的脚本是检测一个进程状态的sh,每隔3秒钟执行一次,用nohup把sh进程挂到后台去。这里没有用crontab,之所以没用是因为crontab似乎权限不允许我执行kill命令 造成脚本运行失效。所以用一个简单的办法,直接用root启动挂到后台去。
- #!/bin/bash
- #check process,job,send system data
- rm -rf CreatePlayer.txt
- DBIP=127.0.0.1
- DBUser=dbjob
- DBPass=dbjob
- DBName=userDB
- UserTime=' 00:00:00'
- for NewDat in `date +"%Y-%m-%d"`
- do
- NewDat=$NewDat$UserTime
- break
- done
- for YesDay in `date -d '-1 day' +"%Y-%m-%d"`
- do
- YesDay=$YesDay$UserTime
- break
- done
- echo 'call proc_job_user_select('\'$YesDay\'','\'$NewDat\'')' > run.sql
- #straaa='mysql -h'$DBIP' -u'$DBUser' -p'$DBPass' -D'$DBName' -e'$Proc
- #echo $straaa
- mysql -h$DBIP -u$DBUser -p$DBPass -D$DBName --execute="source /job/run.sql" > CreatePlayer.txt
- echo 'Save proc_job_player_select() OK'
- cat CreatePlayer.txt | mail -s "当日注册" liuyunxiang@9thq.com
复制代码 这个是sh调用mysql执行某一个维护性的存储过程,并把数据结果发送给某一个邮箱。一般维护统计的时候,这个脚本比较有用,当然,你也可以不用mysql,统计日志亦然。 |
|