Linux中创建web项目及jar启动脚本

以启动jar项目为例写一个启动脚本

第一步创建一个.sh文件:

1
2
3

touch xx.sh

第二步编辑xx.sh文件,然后按I输入:#!/usr/bin/env bash

1
2
3
4
5

vi xx.sh

#!/usr/bin/env bash

注:#!/usr/bin/env bash #在不同的系统上提供了一些灵活性

第三步配置环境变量

同样在xx.sh文件中编写如下代码:(文件实际地址请自行根据自己的系统设置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

export LANG=en_US.UTF-8

export JAVA_HOME=/usr/java/jdk.1.8.0_144

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH

cd 'dirname $0'

CURRENT_DIR='pwd'

LOGS_DIR="${CURRENT_DIR}/logs"

STDOUT_FILE="${CURRENT_DIR}/logs/stdout.log"

PROJECT_HOME="${CURRENT_DIR}/project"

JAR_FILE="${PROJECT_HOME}/xx.jar"



注:上面的“.”,”:”,分别表示当前目录和分隔符及多层路径,其中$path,$classpath在定义变量中没有出现,则表示引用系统环境变量,java_home有自己定义则使用上面自己定义的。

查看系统环境变量直接输入env:

1
2
3

env

一个完整的jar启动脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

#!/usr/bin/env bash

export LANG=en_US.UTF-8
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH

cd `dirname $0`
CURRENT_DIR=`pwd`
LOGS_DIR="${CURRENT_DIR}/logs"
STDOUT_FILE="${CURRENT_DIR}/logs/stdout.log"
PROJECT_HOME="${CURRENT_DIR}/project"
JAR_FILE="${PROJECT_HOME}/tisson-open-rpc-service.jar"

# date pattern
DATE_PATTERN="[$(date '+%Y-%m-%d %H:%M:%S')] ${JAR_FILE}"

# pid
PIDS=`ps -ef | grep "${JAR_FILE}" | grep -v grep | awk '{print $2}'`
# -- ps -ef | grep xx 查文本的信息的数据 grep -v grep 查询不含有grep数据的值
# awk '{pring $2}' $2:表示第二个字段,print$2 : 打印第二个字段
# JVM options
JAVA_OPT="-server -Xms1024m -Xmx1024m -Xss256k"
JAVA_OPT="${JAVA_OPT} -Dloader.path=${PROJECT_HOME}/lib/ -Djava.io.tmpdir=${LOGS_DIR}"
#-XX:+DisableExplicitGC 启用禁用处理对System.gc()的调用的选项。 默认情况下禁用此选项,这意味着将处理对System.gc()的调用。 如果禁用对System.gc()的调用处理,则JVM在必要时仍执行GC。

#UseConcMarkSweepGC 允许为旧一代使用CMS垃圾收集器。 Oracle建议您在吞吐量(-XX:+ UseParallelGC)垃圾收集器无法满足应用程序延迟要求时使用CMS垃圾收集器--
#。 G1垃圾收集器(-XX:+ UseG1GC)是另一种选择。--
#默认情况下,禁用此选项,并根据计算机的配置和JVM的类型自动选择收集器。 启用此选项后,将自动设置-XX:+ UseParNewGC选项,--
#您不应禁用它,因为JDK 8中已弃用以下选项组合:-XX:+ UseConcMarkSweepGC -XX:-UseParNewGC。

#CMSParallelRemarkEnabled

#LargePageSizeInBytes 在Solaris上,设置用于Java堆的大页面的最大大小(以字节为单位)。 size参数必须是2的幂(2,4,8,16,...)。
# 附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。 默认情况下,大小设置为0,这意味着JVM会自动选择大页面的大小。

#UseFastAccessorMethods 原始类型的快速优化

#XX:+UseCMSInitiatingOccupancyOnly 使用手动定义初始化定义开始CMS收集

#XX:CMSInitiatingOccupancyFraction=70 使用cms作为垃圾回收使用70%后开始CMS收集
JAVA_OPT="${JAVA_OPT} -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70"
JAVA_OPT="${JAVA_OPT} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGS_DIR}/${PIDS}.hprof"
JAVA_OPT="${JAVA_OPT} -Xloggc:${LOGS_DIR}/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
JAVA_OPT="${JAVA_OPT} -Ddubbo.protocol.port=20882"
#启动Java应用时,通过-D传入系统参数
#-Dspring.profiles.active=dev
JAVA_OPT="${JAVA_OPT} -Dspring.profiles.active=dev"
JAVA_OPT="${JAVA_OPT} -jar ${JAR_FILE}"

function operate(){
if [[ "$1" = "kill" ]]; then
if [ -n "${PIDS}" ]; then
echo "${DATE_PATTERN} kill ${PIDS} begining" | tee -a ${STDOUT_FILE}
kill -9 ${PIDS}
echo "${DATE_PATTERN} kill ${PIDS} success" | tee -a ${STDOUT_FILE}
else
echo "${DATE_PATTERN} is not alive" | tee -a ${STDOUT_FILE}
fi
elif [[ "$1" = "start" ]] ; then
cd $PROJECT_HOME
# starting
nohup $JAVA_HOME/bin/java ${JAVA_OPT} >> ${STDOUT_FILE} 2>&1 &
PIDS=`ps -ef | grep "$JAR_FILE" | grep -v grep | awk '{print $2}'`
echo "${DATE_PATTERN} The $JAR_FILE started OK! pid: ${PIDS}" | tee -a ${STDOUT_FILE}
else
echo "${DATE_PATTERN} is not support $1" | tee -a ${STDOUT_FILE}
fi
}
#tee -a file
#输出到标准输出的同时,追加到文件file中。如果文件不存在,
#则创建;如果已经存在,就在末尾追加内容,而不是覆盖。
if [[ "$1" = "start" || "$1" = "check" ]]; then
if [ -n "${PIDS}" ]; then
echo "${DATE_PATTERN} already started! pid: ${PIDS}" >> ${STDOUT_FILE}
exit 1
fi
operate start
elif [[ "$1" = "" || "$1" = "restart" ]]; then
operate kill
echo "${DATE_PATTERN} starting" | tee -a ${STDOUT_FILE}
operate start
elif [[ "$1" = "kill" ]]; then
operate kill
else
echo "${DATE_PATTERN} is not support $1" | tee -a ${STDOUT_FILE}
fi

配置一个web项目启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

#!/usr/bin/env bash

cd `dirname $0`
HOME_DIR=`pwd`

# Tomcat服务器路基
TS_HOME="$HOME_DIR/tomcat"
# crontab检测日记文件
TS_LOG_OPERATE="$TS_HOME/logs/console.out"
# 检测Tomcat是否启动(进程ID)
TS_PID=`ps -ef | grep $TS_HOME/bin | grep -v grep | awk '{print $2}'`
# 执行检测的用户IP地址
TS_IP=`who am i | awk '{print $5}' | sed 's/(//g' | sed 's/)//g'`
# 检测输出的日记格式
TS_PATTERN="[$(date '+%Y-%m-%d %H:%M:%S')]-[$1]-[$TS_IP] $TS_HOME"

#===========================================================================================
# JVM Configuration
#===========================================================================================
export LANG=en_US.UTF-8
export JAVA_HOME=/usr/java/jdk1.8.0_144
export JAVA_OPTS="$JAVA_OPTS -server -Xms1g -Xmx1g -Xss256k"
export JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled"
export JAVA_OPTS="$JAVA_OPTS -Xloggc:$TS_HOME/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
export JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$TS_HOME/logs/dump-`date +"%Y-%m-%d"`.hprof"
export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=dev"

#===========================================================================================
# log file delete
#===========================================================================================
function cleanLog(){
ls -d -t $TS_HOME/logs/catalina.*.log | tail -n +7 | xargs rm -rf
ls -d -t $TS_HOME/logs/host-manager.*.log | tail -n +7 | xargs rm -rf
ls -d -t $TS_HOME/logs/localhost.*.log | tail -n +7 | xargs rm -rf
ls -d -t $TS_HOME/logs/manager.*.log | tail -n +7 | xargs rm -rf
ls -d -t $TS_HOME/logs/dump.*.hprof | tail -n +3 | xargs rm -rf
}
cleanLog

function operate(){
if [[ "$1" = "kill" ]] ; then
if [[ "$TS_PID" = "" ]] ; then
echo "$TS_PATTERN is not alive" | tee -a $TS_LOG_OPERATE
else
echo "$TS_PATTERN kill $TS_PID begining" | tee -a $TS_LOG_OPERATE
kill -9 $TS_PID
echo "$TS_PATTERN kill $TS_PID success" | tee -a $TS_LOG_OPERATE
fi
elif [[ "$1" = "start" ]]; then
cd $TS_HOME/bin
sh startup.sh
else
echo "$TS_PATTERN is not support $1" | tee -a $TS_LOG_OPERATE
fi
}
if [[ "$1" = "" || "$1" = "restart" || "$1" = "start" ]] ; then
operate kill
echo "$TS_PATTERN starting" | tee -a $TS_LOG_OPERATE
operate start
elif [[ "$1" = "kill" ]] ; then
operate kill
elif [[ "$1" = "check" ]] ; then
if [[ "$TS_PID" = "" ]] ; then
echo "$TS_PATTERN starting" >> $TS_LOG_OPERATE
operate start
else
echo "$TS_PATTERN pid $TS_PID" >> $TS_LOG_OPERATE
fi
else
echo "$TS_PATTERN is not support $1" | tee -a $TS_LOG_OPERATE
fi