生产环境上shell的解读
一直以来对shell都不是很熟悉,只停留在基本的linux上操作上,这周因为定位问题接触到了生产环境上的脚本,因此作为引子学习一下。很多命令只是点到,等真正需要独立完成的时候再去学习。
#!/bin/sh #set -x 打印出调试信息
MYNAME=rawload
eamid=$
emsentityid=$
WORK_DIR=${PM4H_APP}/module/rawload
LOAD_DIR=${PM4H_SPOOL}/${eamid}/${emsentityid}/load
LOAD_BACKUP_DIR=${PM4H_SPOOL}/${eamid}/${emsentityid}/load_backup
FILELIST=${PM4H_SPOOL}/${eamid}/${emsentityid}/etc/.rawloadfilelist #调用返回sql执行结果
SQLEXECCMD="$JAVA -jar $NETWATCHER_HOME/pm4h2/app/lib/sqlexec.jar" PRESENTLIST=${PM4H_SPOOL}/${eamid}/${emsentityid}/etc/.presentlist
LASTLIST=${PM4H_SPOOL}/${eamid}/${emsentityid}/etc/.lastlist
CFORMATLIST=${PM4H_SPOOL}/${eamid}/${emsentityid}/etc/.cformatlist
CDELETELIST=${PM4H_SPOOL}/${eamid}/${emsentityid}/etc/.cdeletelist
FORMATEDLIST=${PM4H_SPOOL}/${eamid}/${emsentityid}/etc/.formatedlist pidfile=.$MYNAME.$eamid.$emsentityid.pid #test -f 命令可以判断文件是否存在
if test -f ${WORK_DIR}/${pidfile}
then
# See if a process is running with that process id
pid=`cat $WORK_DIR/$pidfile` # test -n 字符串的长度非0
if test -n "$pid"
then
# 这句话的意思是:查看所有包含有$MYNAME关键字的进程,并且去掉grep本身进程,将输出结果按照空格分割,并打印如第二个参数,并从中查询包含了$pid的记录,输出到/dev/null(废弃)
ps -ef|grep $MYNAME|grep -v grep|$AWK '{print $2}'|grep $pid > /dev/null
# $? 表示上一次命令执行的结果值,测试上一次执行结果是否为0,0表示匹配成功,1表示失败
if test $? -eq
then
# The process is running !
echo "The process is running !"
exit
else
# Try the ps listing again as it is not always reliable
#ps -ef|grep $pid|grep $MYNAME > /dev/null
ps -ef|grep $MYNAME|grep -v grep|$AWK '{print $2}'|grep $pid > /dev/null
if test $? -eq
then
# The process is running !
echo "The process is running !"
exit
fi
fi
fi
fi # 将当前运行此脚本的进程号写入$pidfile
echo $$ > $WORK_DIR/$pidfile
# Check process is existence
if [ ! -f ${WORK_DIR}/rawload.jar ] ; then
printf "Error: Can not find the file ${WORK_DIR}/rawload.jar\n"
return
fi #每次处理个数默认是1000,数据库中的配置
pifcounter="" #get pif files' number to batch load
sql="select t.parametervalue from pm4h_ad.cfg_sysparameter t where t.parametermoduleid='BG_RAWLOAD' and t.parameterid='${eamid}_PIFNUM'" echo $sql > ${WORK_DIR}/.getpifnum.sql
# 执行SQL,因无法直接获取到查询结果,故将结果写入到.pifnumresult中
$SQLEXECCMD ${WORK_DIR}/.getpifnum.sql "$ORACLE_IP;$ORACLE_PORT;$ORACLE_SID;$ORACLE_ADUSER;$ORACLE_ADPWD" > ${WORK_DIR}/.pifnumresult
# 如果上面的shell执行成功,则获取
if [ $? -eq ]; then
# 使用|分割行,并取第二行,打印出第一部分,NR表示读取的文件行数;FNR表示读取到的当前文件的行数,NR==FNR常用语判断输入多个文件时读取到第一个文件
pifcounter=`$AWK -F\| '{if(NR==2){print $1}}' ${WORK_DIR}/.pifnumresult`
fi
if [ "$pifcounter" = "" ]; then
# 如果针对某一ems实体的配置为空,则获取全局ems配置
sql="select t.parametervalue from pm4h_ad.cfg_sysparameter t where t.parametermoduleid='BG_RAWLOAD' and t.parameterid='PIFNUM'"
echo $sql > ${WORK_DIR}/.getpifnum.sql
$SQLEXECCMD ${WORK_DIR}/.getpifnum.sql "$ORACLE_IP;$ORACLE_PORT;$ORACLE_SID;$ORACLE_ADUSER;$ORACLE_ADPWD" > ${WORK_DIR}/.pifnumresult
if [ $? -eq ]; then
pifcounter=`$AWK -F\| '{if(NR==2){print $1}}' ${WORK_DIR}/.pifnumresult`
fi
if [ "$pifcounter" = "" ];then
# 如果上面的都失败了,则插入该记录到数据库,并设置默认值1000
sql="insert into pm4h_ad.cfg_sysparameter(PARAMETERMODULEID,PARAMETERID,PARAMETERNAME,PARAMETERVALUE,DESCRIPTION) values('BG_RAWLOAD','PIFNUM','PIFNUM',1000,'the number of pif files which are handled by one process');"
echo $sql > ${WORK_DIR}/.insertpifnum.sql
$SQLEXECCMD ${WORK_DIR}/.insertpifnum.sql "$ORACLE_IP;$ORACLE_PORT;$ORACLE_SID;$ORACLE_ADUSER;$ORACLE_ADPWD"
pifcounter=
fi
fi # 获取是否加载历史数据配置
sql="select t.parametervalue from pm4h_ad.cfg_sysparameter t where t.parametermoduleid='BG_ALL' and t.parameterid='DATAPRIORITY'"
echo $sql > ${WORK_DIR}/.selecthistorydate.sql
$SQLEXECCMD ${WORK_DIR}/.selecthistorydate.sql "$ORACLE_IP;$ORACLE_PORT;$ORACLE_SID;$ORACLE_ADUSER;$ORACLE_ADPWD" > ${WORK_DIR}/.ishistorydataresult if [ $? -eq ];then
ishistorydata=`$AWK -F\| '{if(NR==2){print $1}}' ${WORK_DIR}/.ishistorydataresult`
else
ishistorydata=
fi if [ "$ishistorydata" = "" ];then
ishistorydata=
fi # 将文件名补充为完整的路径并追加到${PRESENTLIST}, {s:old:new:g}, ^表示匹配行开始,$表示匹配行结尾;pif$表示匹配”pif“且字段必须在结尾
ls ${LOAD_DIR}|sed "s:^:${LOAD_DIR}/:"|grep "\.pif$" > ${PRESENTLIST}
# 如果存在${LASTLIST}并且不存在${FORMATEDLIST},那么删除${LASTLIST};-a在test中表示and,&&仅当第一个判断为真时才会执行
test -f ${LASTLIST} -a ! -f ${FORMATEDLIST} && rm -f ${LASTLIST}
# 如果存在${FORMATEDLIST}而且不存在${LASTLIST},那么将${FORMATEDLIST}中的内容使用|分割后,取第三个参数赋值到${LASTLIST}
test -f ${FORMATEDLIST} -a ! -f ${LASTLIST} && awk -F"|" '{print $3 > "'${LASTLIST}'"}' ${FORMATEDLIST}
# 如果${FORMATEDLIST}不存在则新建${FORMATEDLIST}
test -f ${FORMATEDLIST} || touch ${FORMATEDLIST}
# 如果${LASTLIST}不存在则新建
test -f ${LASTLIST} || touch ${LASTLIST}
# 将${LASTLIST}中的内容升序排列并重新输出到${LASTLIST}
sort ${LASTLIST} -o ${LASTLIST}
# 取在${PRESENTLIST}出现但未在${LASTLIST}出现的记录到${CFORMATLIST},也就是新增的需要入库的文件
comm - ${PRESENTLIST} ${LASTLIST} > ${CFORMATLIST}
# 取在${LASTLIST}中,但不在${PRESENTLIST}中的文件列表,也就是需要删除的文件
comm - ${LASTLIST} ${PRESENTLIST} > ${CDELETELIST} # 如果${CDELETELIST}存在且可以被读取,那么执行SynLoadFmts这个jar,主要逻辑是从FORMATEDLIST和LASTLIST删除掉CDELETELIST中的内容
test -s ${CDELETELIST} && $JAVA ${JVM_PARAMETER} -jar -Xmx512m ${WORK_DIR}/SynLoadFmts.jar ${FORMATEDLIST} ${LASTLIST} ${CDELETELIST} ${emsentityid}
# 将 ${CFORMATLIST}中的内容解析并输出到${FORMATEDLIST}
test -s ${CFORMATLIST} && cat ${CFORMATLIST}|xargs -i awk -F"|" '{if(NR==1){for(i=1;i<NF;i++){if($i=="STARTDAY"){j=i;field2=$(i-2);}}}if(NR==3){field3=$j$(j+1);field4=$(j+2);exit;}}END{if(FNR<3){cmd=sprintf("mv %s %s", FILENAME, "'${LOAD_BACKUP_DIR}'");system(cmd);}else{print field3"|"field2"|"FILENAME"|"field4 >> "'${FORMATEDLIST}'";print FILENAME >> "'${LASTLIST}'"}}' {}
if [ "$ishistorydata" = "" ];then
cat ${FORMATEDLIST}|grep -v '\.re[a-z0-9]\{8\}-[a-z0-9]\{4\}-[a-z0-9]\{4\}-[a-z0-9]\{4\}-[a-z0-9]\{12\}\.pif'|sort |head -n $pifcounter > $FILELIST
#取$FILELIST的行数
fileline=`cat $FILELIST|wc -l`
#如果要采集的正常文件不足1000,则进行补采
if [ $fileline -lt $pifcounter ];then
addfilenumber=`expr $pifcounter \- $fileline`
cat ${FORMATEDLIST}|grep '\.re[a-z0-9]\{8\}-[a-z0-9]\{4\}-[a-z0-9]\{4\}-[a-z0-9]\{4\}-[a-z0-9]\{12\}\.pif'|sort |head -n $addfilenumber >> $FILELIST fi
else
#history data
cat ${FORMATEDLIST}|grep '\.re[a-z0-9]\{8\}-[a-z0-9]\{4\}-[a-z0-9]\{4\}-[a-z0-9]\{4\}-[a-z0-9]\{12\}\.pif'|sort |head -n $pifcounter > $FILELIST fileline=`cat $FILELIST|wc -l`
if [ $fileline -lt $pifcounter ];then
addfilenumber=`expr $pifcounter \- $fileline`
cat ${FORMATEDLIST}|grep -v '\.re[a-z0-9]\{8\}-[a-z0-9]\{4\}-[a-z0-9]\{4\}-[a-z0-9]\{4\}-[a-z0-9]\{12\}\.pif'|sort |head -n $addfilenumber >> $FILELIST fi
fi $JAVA `echo ${JVM_PARAMETER}|sed 's/'-DORACLE_SID=$ORACLE_SID'/'-DORACLE_SID=$ORACLE_SID1'/'` -cp ${CLASSPATH} -jar ${WORK_DIR}/rawload.jar $LOAD_DIR $LOAD_BACKUP_DIR ${emsentityid} ${FILELIST}
rm -f ${WORK_DIR}/$pidfile
rm -f ${WORK_DIR}/.getpifnum.sql
rm -f ${WORK_DIR}/.pifnumresult
rm -f ${WORK_DIR}/.insertpifnum.sql
rm -f ${WORK_DIR}/.selecthistorydate.sql
rm -f ${WORK_DIR}/.ishistorydataresult
rm -f ${WORK_DIR}/.emptyfile
test -f ${PRESENTLIST} && rm -f ${PRESENTLIST}
test -f ${CFORMATLIST} && rm -f ${CFORMATLIST}
test -f ${CDELETELIST} && rm -f ${CDELETELIST}
#echo -e "End:\t`date +%Y-%m-%d" "%H:%M:%S`" >> ${PM4H_SPOOL}/${eamid}/${emsentityid}/etc/time
#set +x
exit
生产环境上shell的解读的更多相关文章
- 如何一步步在生产环境上部署django和vue
本文由云+社区发表 本文主要讲述了如何一步步在生产环境上部署django和vue,操作系统默认为centos 说明:后文中出现的以下字符串均表示具体的路径或者名称,含义如下: DJANGO_DIR-- ...
- Linux生产环境上,最常用的一套“AWK“技巧【转】
最有用系列: <Linux生产环境上,最常用的一套“vim“技巧> <Linux生产环境上,最常用的一套“Sed“技巧> <Linux生产环境上,最常用的一套“AWK“技 ...
- 生产环境上,哨兵模式集群Redis版本升级应用实战
背景: 由于生产环境上所使用的Redis版本并不一致,好久也没有更新,为了避免版本不同对Redis集群造成影响,从而升级为统一Redis版本! 1.集群架构 一主两从三哨兵: 2.升级方案 (1)升级 ...
- Liu Junqiao:生产环境中shell脚本实例
在生产环境中,我们时常要注意主机的各种硬件状态,如果是规模较大的服务集群zabbix等健康工具当然好用,如果只是一些小规模的服务主机,shell就会表现的更灵活,也更适用,今天就和大家分享一个系统巡检 ...
- maven项目打包部署到虚拟机测试和生产环境上及查看日志操作
调试通过后提交代码到gitlab,打包部署到相应环境(测试或生产环境)步骤一样1.打包在要打包的项目上右键run as maven clean 清除原来的包,然后run as maven instal ...
- iOS中远程推送实现—在Apple的生产环境上测试Push Notifications功能
1.在“Provisioning Profiles”中点击“Add”按钮. 2.在“What type of provisioning profile do you need?”页面中选择“Distr ...
- Linux生产环境上,最常用的一套“Sed“技巧
sed命令应用广泛,使用简单,是快速文本处理的利器.它其实没多少技巧,背诵.使用是最合适的学习渠道,属于硬技能.但它又很复杂,因为高级功能太多.本篇不去关注sed的高级功能,仅对常用的一些操作,进行说 ...
- 利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境
一.环境描述 安装有ansible的服务器:192.168.13.45 测试环境服务器:192.168.13.49 /home/app/api-tomcat/webapps/api.war为测试环境新 ...
- .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)
最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...
随机推荐
- java 中的this关键字的几种用法
转自:http://blog.csdn.net/anmei2010/article/details/4091227 1. 当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在 ...
- Web服务器集群搭建关键步骤纪要
前言:本文记述了搭建一个小型web服务器集群的过程,由于篇幅所限,系统.软件的安装和基本配置我这里就省略了,只记叙关键配置和脚本内容.假如各位朋友想了解各软件详细配置建议查阅官方文档. 一 需求分析: ...
- log4net 配置
1.在项目中引入log4net.dll组件: 2.在App.congfig中做如下修改 在加入如下内容: 这个节点最好放在<configuration>下的第一个位置,不然在服务里会报错. ...
- gridView AspNetPager 翻页时 弹出窗体关闭报错
gridView AspNetPager 翻页后,你右击刷新或F5会发现弹出一个刷新页面. 这是因为默认翻页都是用dopostback方式回发的.因为这时的页面已经不是原来的页面.所以会弹出提示. 这 ...
- 【BZOJ 2143】 飞飞侠
Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街区都装有 ...
- The ‘Microsoft.ACE.OLEDB.12.0′ provider is not registered on the local machine. (System.Data)
When you try to import Excel 2007 or later “.xlsx” files into an SQL Server 2008 database you may ge ...
- 1057: [ZJOI2007]棋盘制作 - BZOJ
Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...
- A geometric interpretation of the covariance matrix
A geometric interpretation of the covariance matrix Contents [hide] 1 Introduction 2 Eigendecomposit ...
- Java 另一道构造器与构造器重载的题目
题目: 请写出以下程序的输出结果 public class ConstructorTest2 { public static void main(String[] args) { new B(&quo ...
- 【BZOJ 2829】 2829: 信用卡凸包 (凸包)
2829: 信用卡凸包 Description Input Output Sample Input 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 Sa ...