以下是一个appenv文件,此文件里记录了运行脚本里所需要的一些参数
SERVICE_ID=jlxe.front3//指明程序的标示
SERVICE_NAME="运行程序的名称"
SERVICE_CONTEXT=front3_common.xml,app_my.xml//后面一个脚本中所需用到的参数
MainClass=com.umpay.front3.core.Main//主函数
以下是启动程序所需要的脚本run.sh
#!/bin/bash
export LANG=zh_CN.GB18030
. appenv
. classpath
pid=`ps -wwef|grep "Dflag=${SERVICE_ID}"|grep -v grep`
if [ -n "${pid}" ]
then
echo "${SERVICE_NAME} 已经启动."
else
nohup java -cp ${APPCLASSPATH} -Dflag=${SERVICE_ID} ${MainClass} ${SERVICE_CONTEXT} &
sleep 1
. state.sh
fi
. runv.sh
一一解释,export命令将自定义变量LANG设为环境变量,以保证其主进程与子进程有相同该值的环境变量。.appenv引入appenv文件,.classpath为引入clapath文件,classpath问项目运行所要引进的一些jar包,文件,以及编译后的.class文件,我就不将其贴出了。pid=`ps -wwef|grep "Dflag=${SERVICE_ID}"|grep -v grep`该句话的意思为查找出该项目的进程,慢慢解释,其中ps -ww的意思为避免详细参数被截断,ps -e 为显示所有进程及环境变量,ps -f 为全格式显示。ps -wwef 的意思就是说以全格式的方式无截断的显示所有进程信息以及环境变量。grep "Dflag=${SERVICE_ID}"为找出进程中含有指定Dflag名字的进程号,最后那一句话为grep -v 为不显示匹配文本的所有行,grep -v grep意思就是说删掉grep这一行。if语句中[-n "${pid}"],-n表示指定的变量不为空。else中为所要执行的java程序的语句。nohup这个命令可以让你在脱机或注销系统后,还能够让工作继续进行。而加上&表示终端机在后台工作,不加则表示在前台工作。而信息的输出就被定位到nohup.out中去了。现在对java -cp来进行解释,第一个字段为所需要的jar包路径,class文件,以及其他一下运行需要的文件,-Dflag,一定要是-D(变量名)这种格式,代表设置了一个系统属性,可以通过System.getProperties()来获取到。sleep 1代表睡眠一秒钟然后执行.state.sh脚本,最后再执行.runv.sh。
以下是runv.sh,就是在run.sh在执行最后执行的shell脚本
#!/bin/bash
clear
sleep 1
tail -50f nohup.out
其中clear为清空屏幕,sleep 1为休眠一秒钟,tail -50f nohup.out 动态的监测nohup.out文件的后50行内容。
以下是state.sh,用来判断该进程是否运行的标志
#!/bin/bash
. appenv
pid=`ps -wwef|grep "Dflag=${SERVICE_ID}"|grep -v grep`
if [ -n "${pid}" ]
then
echo "${SERVICE_NAME} 已经启动."
else
echo "${SERVICE_NAME} 未启动."
fi
所有代码已在上面解释过,不再重复。
以下是stop.sh,用来停止该进程。
#!/bin/bash
. appenv
sleep 1
pid=`ps -wwef|grep "Dflag=${SERVICE_ID}"|grep -v grep`
if [ -n "${pid}" ]
then
ps -wwef|grep Dflag=${SERVICE_ID}|grep -v grep|grep -v tail|awk 'BEGIN{printf "kill "}{printf "%s ", $2}'|bash
echo "${SERVICE_NAME} 服务已停止!"
else
echo "${SERVICE_NAME} 未启动."
fi
需要解释的只有一个awk,命令,awk默认的语法格式为 awk ' Pattern {Action}',只有当pattern判断为true时执行action,所谓的pattern为一个关系表达式,如3>2,1==3,等等吧,也可以为一个正则表达式的判断~表示match 某一个正则表达式,!~表示不匹配某一个正则表达式,(例如:
"banana" ~ /an/)只要结果为true则执行后面的action。若pattern缺省,则表示直接执行action。而后面action的语法,和C语言是很类似的。所以在此程序中awk 执行的语句即为,kill 进程号,所以在stop.sh中,即找到与某Dflag匹配的程序,并将其进程号杀掉。
以下为restart.sh的shell脚本,意思是对此程序进行重新启动。代码不再解释,已在上面重复出现过。
#!/bin/bash
. appenv
sleep 1
pid=`ps -wwef|grep "Dflag=${SERVICE_ID}"|grep -v grep`
if [ -n "${pid}" ]
then
ps -wwef|grep Dflag=${SERVICE_ID}|grep -v grep|grep -v tail|awk 'BEGIN{printf "kill "}{printf "%s ", $2}'|bash
echo "${SERVICE_NAME} 服务已停止!"
else
echo "${SERVICE_NAME} 未启动."
fi
. run.sh
而在管道命令后加一个bash,经测试,本人理解为,awk执行后的结果为打印命令,加上bash后即为按照bash命令来执行这个打印语句。