linux后台运行jar包,经常以外退出,定时计划运行sh检查jar包运行并重启
新建restart.sh
root@instance-1:~/sub#touch restart.sh
权限设置744(需要注意定时任务的用户有没有运行权限)
root@instance-1:~/sub#chmod 744 restart.sh
编辑restart.sh 文件:
#!/bin/sh
export LANG="en_US.UTF-8"
export JAVA_HOME=/usr/java/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/dt.jar:$JAVA_HOME/tools.jar
#java环境变量
log_file="restart_logs/server.log"
jar_prod="some-java-1.0.0-uber.jar"
jar_file=${jar_prod}
down_logs(){
mkdir -p restart_logs
dates=`date`
echo -e "${dates}---${1} down! ${2} ..." >> ${log_file}
}
check_process(){
ps -ef | grep ${1} |grep -v "grep"
if [ $? -ne 0 ]
then
if [ -f ${2} ]
then
(java -jar ${2} &) && down_logs ${1} "restart :${3}"
else
down_logs ${2} "no java file"
fi
# else
# down_logs ${1} "is running"
fi
}
check_process ${jar_prod} ${jar_file} "${1}"
#echo -e "${PATH}" >> ${log_file}
定时任务,每小时检查jar包运行,如果退出重启
root@instance-1:~#crontab -e
* */1 * * * /bin/sh /root/sub/restart.sh
参考:crontab用户权限
另外2个shell
#!/bin/sh
#解压
mkdir /usr/java/
tar -zxvf server-jre-8u151-linux-x64.tar.gz -C /usr/java/
#配置java环境
echo -e "\n\n" >> /etc/profile
echo "#java" >> /etc/profile
echo "export JAVA_HOME=/usr/java/jdk1.8.0_151" >> /etc/profile
echo "export JRE_HOME=${JAVA_HOME}/jre" >> /etc/profile
echo "export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib" >> /etc/profile
echo "export PATH=${JAVA_HOME}/bin:$PATH" >> /etc/profile
source /etc/profile
ln -s /usr/java/jdk1.8.0_151/bin/java /usr/bin/java
#更快关闭不需要的TCP连接
#https://www.cnblogs.com/baihuitestsoftware/articles/13093517.html
#https://toutiao.io/posts/me0nza/preview
echo "#catcher h5 server" >> /etc/sysctl.conf
#echo "net.ipv4.tcp_max_tw_buckets = 6000" >> /etc/sysctl.conf
#echo "net.ipv4.ip_local_port_range = 8000 9000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
#echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
#echo "net.core.netdev_max_backlog = 1000" >> /etc/sysctl.conf
#echo "net.ipv4.tcp_max_orphans = 1000" >> /etc/sysctl.conf
#echo "net.ipv4.tcp_max_syn_backlog = 1024" >> /etc/sysctl.conf
#echo "net.ipv4.tcp_synack_retries = 1" >> /etc/sysctl.conf
#echo "net.ipv4.tcp_syn_retries = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 2" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_time = 900" >> /etc/sysctl.conf
echo "net.ipv4.tcp_orphan_retries = 3" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_intvl = 15" >> /etc/sysctl.conf
echo "net.ipv4.tcp_retries2 = 5" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
sysctl -p
#定时检查
chmod 777 restart.sh
crontab -l > /tmp/crontab.bak
echo '*/1 * * * * cd /root && /bin/sh restart.sh "check" 1>/dev/null 2>&1' >> /tmp/crontab.bak
crontab /tmp/crontab.bak
#!/bin/sh
backup_folder="backup"
jar_prod="some-java-1.0.0-uber.jar"
jar_file=${jar_prod}
new_jar_file="upload/${jar_file}"
#部署新的jar
new_server(){
if [ -f ${new_jar_file} ]
then
backup
kill_process
mv_file
sleep 1
wait
else
echo "no ${new_jar_file}"
fi
sh check_catcher_free.sh "${1}"
}
#当前jar文件备份
backup(){
mkdir -p ${backup_folder}
dates=`date "+%Y%m%d_%H%M%S"`
cp ${jar_file} ${backup_folder}/${jar_file}.${dates}
#wait for cp finish
if [ $? -ne 0 ]
then
echo "cp $?"
sleep 1
wait
fi
}
#杀掉当前进程
kill_process(){
pid=$(ps x | grep ${jar_prod} | grep -v "grep" | awk '{print $1}')
if [ -z "${pid}" ]
then
echo "${jar_prod} not running"
else
kill ${pid}
fi
}
#从upload移动到当前目录
mv_file(){
mv -f ${new_jar_file} ${jar_file}
#wait for mv finish
if [ $? -ne 0 ]
then
echo "mv $?"
sleep 1
wait
fi
}
new_server "${1}"
#kill_process