1#!/bin/sh 2#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用, 3#也可以作为启动java程序的独立脚本来使用。 4# 5# 6#警告!!!:该脚本stop部分使用系统kill命令来强制终止指定的java程序进程。 7#在杀死进程前,未作任何条件检查。在某些情况下,如程序正在进行文件或数据库写操作, 8#可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本, 9#增加在执行kill命令前的一系列检查。 10# 11# 12################################### 13#环境变量及程序执行参数 14#需要根据实际环境以及Java程序名称来修改这些参数 15################################### 16#JDK所在路径 17JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-2.b15.el7_3.x86_64/jre" 18 19#执行程序启动所使用的系统用户,考虑到安全,推荐不使用root帐号 20RUNNING_USER=root 21 22#Java程序所在的目录(classes的上一级目录) 23APP_HOME=/opt/mapu/WEB-INF 24 25#需要启动的Java主程序(main方法类) 26APP_MAINCLASS=org.mapu.common.AesUtil 27 28#拼凑完整的classpath参数,包括指定lib目录下所有的jar 29CLASSPATH=$APP_HOME/classes 30for i in "$APP_HOME"/lib/*.jar; do 31 CLASSPATH="$CLASSPATH":"$i" 32done 33 34#java虚拟机启动参数 35JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m" 36 37################################### 38#(函数)判断程序是否已启动 39# 40#说明: 41#使用JDK自带的JPS命令及grep命令组合,准确查找pid 42#jps 加 l 参数,表示显示java的完整包路径 43#使用awk,分割出pid ($1部分),及Java程序名称($2部分) 44################################### 45#初始化psid变量(全局) 46psid=0 47 48checkpid() { 49 #javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAINCLASS` 50 51 #if [ -n "$javaps" ]; then 52 #psid=`echo $javaps | awk '{print $1}'` 53 #else 54 #psid=0 55 #fi 56 javaps=`ps -ef|grep APP_MAINCLASS|grep -v grep| awk '{print $2}'` 57 if [ -n "$javaps" ]; then 58 psid=`echo $javaps | awk '{print $1}'` 59 else 60 psid=0 61 fi 62} 63 64################################### 65#(函数)启动程序 66# 67#说明: 68#1. 首先调用checkpid函数,刷新$psid全局变量 69#2. 如果程序已经启动($psid不等于0),则提示程序已启动 70#3. 如果程序没有被启动,则执行启动命令行 71#4. 启动命令执行后,再次调用checkpid函数 72#5. 如果步骤4的结果能够确认程序的pid,则打印[OK],否则打印[Failed] 73#注意:echo -n 表示打印字符后,不换行 74#注意: "nohup 某命令 >/dev/null 2>&1 &" 的用法 75################################### 76start() { 77 checkpid 78 79 if [ $psid -ne 0 ]; then 80 echo "================================" 81 echo "warn: $APP_MAINCLASS already started! (pid=$psid)" 82 echo "================================" 83 else 84 echo -n "Starting $APP_MAINCLASS ..." 85 #JAVA_CMD="nohup $JAVA_HOME/bin/java $JAVA_OPTS -classpath $CLASSPATH $APP_MAINCLASS >/dev/null 2>&1 &" 86 JAVA_CMD="$JAVA_HOME/bin/java $JAVA_OPTS -classpath $CLASSPATH $APP_MAINCLASS" 87 su - $RUNNING_USER -c "$JAVA_CMD" 88 checkpid 89 if [ $psid -ne 0 ]; then 90 echo "(pid=$psid) [OK]" 91 else 92 echo "[Failed]" 93 fi 94 fi 95} 96 97################################### 98#(函数)停止程序 99# 100#说明: 101#1. 首先调用checkpid函数,刷新$psid全局变量 102#2. 如果程序已经启动($psid不等于0),则开始执行停止,否则,提示程序未运行 103#3. 使用kill -9 pid命令进行强制杀死进程 104#4. 执行kill命令行紧接其后,马上查看上一句命令的返回值: $? 105#5. 如果步骤4的结果$?等于0,则打印[OK],否则打印[Failed] 106#6. 为了防止java程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用stop)。 107#注意:echo -n 表示打印字符后,不换行 108#注意: 在shell编程中,"$?" 表示上一句命令或者一个函数的返回值 109################################### 110stop() { 111 checkpid 112 113 if [ $psid -ne 0 ]; then 114 echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) " 115 su - $RUNNING_USER -c "kill -9 $psid" 116 if [ $? -eq 0 ]; then 117 echo "[OK]" 118 else 119 echo "[Failed]" 120 fi 121 122 checkpid 123 if [ $psid -ne 0 ]; then 124 stop 125 fi 126 else 127 echo "================================" 128 echo "warn: $APP_MAINCLASS is not running" 129 echo "================================" 130 fi 131} 132 133################################### 134#(函数)检查程序运行状态 135# 136#说明: 137#1. 首先调用checkpid函数,刷新$psid全局变量 138#2. 如果程序已经启动($psid不等于0),则提示正在运行并表示出pid 139#3. 否则,提示程序未运行 140################################### 141status() { 142 checkpid 143 144 if [ $psid -ne 0 ]; then 145 echo "$APP_MAINCLASS is running! (pid=$psid)" 146 else 147 echo "$APP_MAINCLASS is not running" 148 fi 149} 150 151################################### 152#(函数)打印系统环境参数 153################################### 154info() { 155 echo "System Information:" 156 echo "****************************" 157 echo `head -n 1 /etc/issue` 158 echo `uname -a` 159 echo 160 echo "JAVA_HOME=$JAVA_HOME" 161 echo `$JAVA_HOME/bin/java -version` 162 echo 163 echo "APP_HOME=$APP_HOME" 164 echo "APP_MAINCLASS=$APP_MAINCLASS" 165 echo "****************************" 166} 167 168################################### 169#读取脚本的第一个参数($1),进行判断 170#参数取值范围:{start|stop|restart|status|info} 171#如参数不在指定范围之内,则打印帮助信息 172################################### 173case "$1" in 174 'start') 175 start 176 ;; 177 'stop') 178 stop 179 ;; 180 'restart') 181 stop 182 start 183 ;; 184 'status') 185 status 186 ;; 187 'info') 188 info 189 ;; 190 *) 191echo "Usage: $0 {start|stop|restart|status|info}" 192exit 1 193esac 194exit 0
java的linux执行的shell
Wesley13
2021-10-11
1517 1 0
点赞
收藏
评论区
加载中...