在本篇文章中我将详细介绍下在linux服务器上用shell脚本发布java工程的步骤。
这是本人第一次写脚本发布程序,尽管写的很烂,但还是写出来和大家分享下。而且我个人认为这个小脚本可以做为一个模板通用。
吹下水,好了进入正题。
假设我们在eclipse中有一个名为ShellTest的工程,现在需要将该工程放在linux服务器上运行,下面给出在服务器上用脚步来控制程序启动的详细步骤。
1.将工程打包为shellTest.jar(jar名根据工程意思任意指定),并将该工程要用的其它jar一起拷贝到lib目录下
2.在与lib目录同级的目录下新建一个目录如bin,用来存放脚步文件
我在bin目录下定义一个名为testshell.sh的脚本,testshell.sh内容如下:
#!/bin/bash
export MY_JAR_PATH=../lib/ #指定工程的jar包所在文件路径(如本文中将工程打的jar包和工程需用的jar文件统一放在与该脚步本件同级的lib目录下,所以这里为../lib)
export LC_CTYPE=zh_CN.gbk #没置本地语言环境
PATH=/usr/lib/jvm/java-6-sun/bin:$PATH #指定java PATH环境变量,
JAVA_HOME=/usr/lib/jvm/java-6-sun/bin #指定java安装路径
CLASSPATH="."
for jar in $MY_JAR_PATH*.jar
do
CLASSPATH=$CLASSPATH:$jar #将lib目录下的jar包加载到环境变量中,注意linux下jar包之间的分隔符是:,而windows下是;
#为了避免当程序由于没有正常执行而退出,然而用户却多次执行该脚本启动程序导致有多个进程的情况,这里可以用一个变量(如我采用在程序启动时判定一个文件tmp.lock是#否存在,若存在说明上次启动java程序没有正常启动,内存中已有对应进程存,提醒用户检查程序,待程序检查完后最好把已存在的该java进程kill掉,然后删除该tmp.lock,再#次执行本脚本来启动java程序)
if [ -f tmp.lock ];then #判断文件是否存在,若存在则调用warn函数给出警报退出程序
warn "需要报警的提示消息" #调用warn函数 同时传入一个参数,所以warn函数中$1就表示接受调用warn函数时传入的第一个参数
exit -1
fi
>tmp.lock #若前面正常执行说明是第一次或上次程序正常执行,此时在发布我们的java程序前这里重定向生成一个tmp.lock的空文件,其作用如前面判定tmp.lock文件所解释
./othershell.sh #这里假设让其它脚本执行,则直接调用即可:脚步文件路径/脚本文件名
if [ $? -ne 0 ] #判断上一条语句或函数是否成功执行(是否不等于0),$?表示上一条语句或函数的返回码,0表示成功执行,非0表示上一条语句或函数执行过程中出现异常或 非正常退出
then
warn "需要报警的提示消息"
exit 1
fi
java -Xms50m -Xmx3000m -XX:-UseGCOverheadLimit com.daen.com.test.ShellTest shellTest >> out #启动java程序:java -Xms50m -Xmx3000m -XX:- #UseGCOverheadLimit分配jvm环境,com.daen.com.test.ShellTest包名+程序入口类名,shellTest自定义一个别名,方便查看进程,>>out将程序中打印结果(如log输出信息)输出到out文件中
if [ $? -ne 0 ];then #判断前面的java程序是否成功执行
warn "需要报警的提示消息"
fi
rm -f tmp.lock #本次成功执行将tmp.lock文件删除
/
将bin和lib目录一起打包后上传到服务器,因于我是在windows下编译脚本的,所以文本换号符是\r\n,而linux的换行符是\n,mac换行符为\r,所以需要转换下。
用vi 命令打开脚本文件,通过:set ff=?来查看文件格式是unix(linux环境下)类型还是dos(windows环境下)类型,若是dos,则用命令set ff=unix做下转换。
用vi命令打开脚本后,通过:set fileencode命令可以查看文本编码方式。
3.对testshell.sh增加执行权限后就可以运行该脚本去启动java程序了,如进入testshell.sh目录执行以下命令:
chmod +x testshell.sh #增加执行权限
./testshell.sh #运行脚本文件
运行后可以该目录下看到一个out文件,里面是工程运行时日志输出内容,同时若程序非正常退出会有一个tmp.lock文件,若正常退出,则tmp.lock文件在程序运行完后就被删除了。
至此一个简单脚本发布java工程的步骤介绍完毕。若想定时启动该java工程则只需定时调用该脚本就可以达到目的了。
下面对上述脚本中用到的知识点给予解释:
1.$n的含义:
$1 表示第一个参数,$2 表示第二个参数 …
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码
$* 以”参数1 参数2 … ” 形式保存所有参数
$@ 以”参数1″ “参数2″ … 形式保存所有参数
$ 本程序的(进程ID号)PID
$! 上一个命令的PID
2.locale
Locale是linux系统中多语言环境的设置接口,Locale根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。
locale把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是:
1)、语言符号及其分类(LC_CTYPE)
2)、数字(LC_NUMERIC)
3)、比较和排序习惯(LC_COLLATE)
4)、时间显示格式(LC_TIME)
5)、货币单位(LC_MONETARY)
6)、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
7)、姓名书写方式(LC_NAME)
8)、地址书写方式(LC_ADDRESS)
9)、电话号码书写方式(LC_TELEPHONE)
10)、度量衡表达方式 (LC_MEASUREMENT)
11)、默认纸张尺寸大小(LC_PAPER)
12)、对locale自身包含信息的概述(LC_IDENTIFICATION)。
在linux下执行locale命令可以看到相关信息:
>locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
设定locale就是设定12大类的locale分类属性,即12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:LC_ALL > LC_* >LANG。可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
3.java环境变量
1). PATH环境变量。作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。
2). CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。
3). JAVA_HOME环境变量。它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。