#!/bin/bash#使用说明,用来提示输入参数function usage() { echo "------ 脚本使用说明 ----- " echo "sh 执行脚本.sh [start|stop|restart|status]" exit 1}# 初始化操作function init(){ echo "--初始化操作中--"}# 读取文件夹下的文件操作function read_file_dir(){echo "-- 读取"$1"文件夹下的文件操作 -- " for file in `ls $1` do if [ -d $1"/"$file ] then read_file_dir $1"/"$file else FILE_NAME=$file JAR_NAME=$1"/"$file JAVA_OUT=$1 J=".jar" # 比较是否事以.jar结尾的文件 if [[ $FILE_NAME == *$J ]]; then echo "!!!找到符合的文件啦!!!" $1"/"$FILE_NAME case "$PARAM" in "start") #start start_application ;; "stop") stop_application ;; "status") status ;; "restart") stop_application start_application ;; *) usage ;; esac fi fi done }# 启动程序操作function start_application(){ echo "-- start 启动程序操作 --" is_running # $? 显示最后命令的退出状态。0表示没有错误 if [ $? -eq "0" ]; then echo "${JAR_NAME} is already running. pid=${pid} ." else echo "JAR_NAME=========="${JAR_NAME} echo "JAVA_OUT=========="${JAVA_OUT} b=${FILE_NAME} nohup java -Xms128m -Xmx256m -Xmn128m -XX:MaxMetaspaceSize=128m -XX:CompressedClassSpaceSize=64m -Xss256k -XX:InitialCodeCacheSize=4m -XX:ReservedCodeCacheSize=60m -XX:MaxDirectMemorySize=16m -jar ${JAR_NAME} >${JAVA_OUT}/${b%.*}.log 2>&1 & apid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}') echo "started ${FILE_NAME} process. pid=${apid}" fi}# 检查程序是否在运行操作function is_running(){ echo "-- 检查程序是否在运行 --" # 查找除了grep操作的 $JAR_NAME 的进程之外的所有进程 这一行信息的第二个字段的值并打印(即pid进程号) # grep -v 意为不包括 | awk '{print $2}'意为取第二个字段输出 pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}') #如果不存在返回1,存在返回0 -z 检测字符串长度是否为0 if [ -z "${pid}" ]; then return 1 else return 0 fi }# function status(){}status(){ is_running # $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 if [ $? -eq "0" ]; then echo "${JAR_NAME} is running. Pid is ${pid}" else echo "${JAR_NAME} is NOT running." fi}function stop_application() { # checkjavapid=$(ps -ef | grep java | grep ${APP_NAME} | grep -v grep | grep -v 'deploy.sh' | awk '{print$2}') checkjavapid=$(ps -ef | grep java | grep ${JAR_NAME} | grep -v grep | awk '{print$2}') if [[ ! $checkjavapid ]]; then echo -e "\rno java process" return fi echo "stop java process" times=60 for e in $(seq 60); do sleep 1 COSTTIME=$(($times - $e)) checkjavapid=$(ps -ef | grep java | grep ${JAR_NAME} | grep -v grep | grep -v 'deploy.sh' | awk '{print$2}') if [[ $checkjavapid ]]; then kill -9 $checkjavapid echo -e "\r -- stopping java lasts $(expr $COSTTIME) seconds." else echo -e "\rjava process has exited" break fi done echo ""}echo "-- 脚本开始执行 --"# 根据脚本输入的参数不同 来执行不同的方法case "$1" in"start") # 执行 start 启动命令 echo "-- 执行 start 启动命令 --" # 定义参数 PARAM="start" # 调取函数 同时传递当前文件夹目录 read_file_dir $(pwd);;"restart") # 执行 restart 启动命令 echo "-- 执行 restart 启动命令 --" PARAM="restart" read_file_dir $(pwd);;"stop") # 执行 stop 启动命令 echo "-- 执行 stop 启动命令 --" PARAM="stop" read_file_dir $(pwd);;"status") # 执行 status 状态查询命令 echo "-- 执行 status 状态查询命令 --" PARAM="status" read_file_dir $(pwd);;*) # 执行默认命令 调用 usage函数给出提醒 usage;;esac