#声明执行该脚本的程序使用sh或bash #! /bin/sh #利用pwd命令获取当前工程目录,实际获取到的是该shell脚本的目录。再利用sed命令将/bin替换为空 Project_HOME=$(echo `pwd` | sed 's/\/bin//') #存放进程文件 ProjectPIDFILE=$Project_HOME/project.pid #case语句,对应结束为esac 特殊变量$1,该变量包含有传递给该脚本的第一个参数值 #一般运行时,都是./**** start or stop ,所以参数值如下所示 case $1 in #输入参数为start时 start) #输出starting project ... ,echo可以看成print to screen echo "Starting project ... " #设置变量Heap的大小,表示JVM虚拟机堆内存的大小,XMS初始化内存,XMX最大内存,一般两个相等且不超过2G。 HEAP_MEMORY=512m #永久域内存,永久区域用来存放Java类及其他虚拟机自己的静态数据, #也包含初始化和最大值,一般设置相等,减少达到初始化值时去申请内存的开销 PERM_MEMORY=64m #JMX连接端口 JMX_PORT=7001 #jvm启动部分参数 JAVA_OPTS="-server -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -XX:+HeapDumpOnOutO fMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.j mxremote.ssl=false" #shift 命令,shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用,位置变量的指向向后移1次 shift #($*)所有参数赋给ARGS,当然$1除外 ARGS=($*) #if循环加case语句,作用就是把shell的参数值赋给之前定义的变量,比如./*.sh start -JmxPort 8888 #则定义的JMX_PORT=7001即变为8888 for ((i=0; i<${#ARGS[@]}; i++)); do case "${ARGS[$i]}" in -D*) JAVA_OPTS="${JAVA_OPTS} ${ARGS[$i]}" ;; -Heap*) HEAP_MEMORY="${ARGS[$i+1]}" ;; -Perm*) PERM_MEMORY="${ARGS[$i+1]}" ;; -JmxPort*) JMX_PORT="${ARGS[$i+1]}" ;; esac done #完整的jvm启动参数,将之前定义的变量组合。 JAVA_OPTS="${JAVA_OPTS} -Xms${HEAP_MEMORY} -Xmx${HEAP_MEMORY} -XX:PermSize=${PERM_MEMORY} -X X:MaxPermSize=${PERM_MEMORY} -Dcom.sun.management.jmxremote.port=${JMX_PORT} -Duser.dir=${Projec t_HOME}" #输出参数 echo "start jvm args ${JAVA_OPTS}" #此条语句最为重要,使用nohup命令启动jar包,nohup命令就是让程序永远在后台运行 nohup java $JAVA_OPTS -jar ${Project_HOME}/bin/project.jar & # $!为系统变量,表示上一个子进程的进程号。 shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。 #不存在直接创建。无论左边命令执行是否成功。右边文件都会变为空。 #重定向不是很理解,个人认为就是将进程号保存在 project.pid文件中 echo $! > $ProjectPIDFILE #打印系统启动成功 echo STARTED #一直不知道两个连着的分号是啥意思,我想应该就是break的意思 ;; #如果$1为stop时 stop) echo "Stopping project ... " #首先判断project.pid是否存在,若不存在返回没有找到文件。-f 判断后面参数是否是一个文件,若是返回1 if [ ! -f $ProjectPIDFILE ] then echo "error: count not find file $ProjectPIDFILE" exit 1 else #杀掉系统进程 $(cat $ProjectPIDFILE) kill -9 $(cat $ProjectPIDFILE) rm $ProjectPIDFILE echo STOPPED fi ;; #如果$1不是start、stop等任意字符时, *) echo "Exec ... " #调用ant来执行这个命令 ant $* ;; #结束case语句 esac exit 0 |