一、环境
带jdk、mysql 等。
我的环境
[root@VM_0_3_centos rc.d]# cat /proc/version
Linux version 3.10.0-862.14.4.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Wed Sep 26 15:12:11 UTC 2018
[root@VM_0_3_centos rc.d]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@VM_0_3_centos rc.d]# mysql -V
mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper
二、项目启动脚本编写
我的实验项目随便放在了/root/springbootdemo 文件夹中,编写 start.sh
RESOURCE_NAME=demo-0.0.1-SNAPSHOT.jar #product name
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'App is running.'
else
echo 'App is NOT running.'
fi
rm -f tpid
nohup java -jar ./$RESOURCE_NAME &
echo $! > tpid
echo Start Success!
注意:此文件必须和jar文件同级!!
编写好之后,启动、重启等,直接使用 sh start.sh 启动即可!
三、编写开机自启服务
查看开机启动项 systemctl list-unit-files
1、编写另外一个启动文件
vi /root/springbootdemo/autostart.sh
#!/bin/sh
JAVA_HOME=/root/tools/javatool/jdk1.8.0_181
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME PATH
nohup java -jar /root/springbootdemo/demo-0.0.1-SNAPSHOT.jar &
回到 /root/springbootdemo文件夹内,ll (ls -l 缩写) 查看列表信息,此时的 autostart.sh 为浅黑色。
执行 ./a (tab键按住)不能自动显示,说明只有读写权限,没有执行权限。
注意:#!/bin/sh是指此脚本使用/bin/sh来解释执行,参考博客 <<Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别>>
2、开启执行权限
给 autostart.sh 文件最大的执行权限:
chmod 777 autostart.sh
关于这个 777 是什么?同事给我做了详细解答
在linux终端先输入ll,可以看到如:
-rwx-r--r-- (一共10个参数) 表示文件所属组和用户的对应权限。
第一个跟参数属于管理员,跟chmod无关,先不管.
2-4参数:属于user
5-7参数:属于group
8-10参数:属于others
接下来就简单了:r==>可读 w==>可写 x==>可执行
r=4 w=2 x=1
所以755代表 rwxr-xr-x
777 代表 rwxr-rwx-rwx 所有用户都可读可写可执行。
例如:
-rwxrwxrwx 1 root root 197 Aug 7 20:16 autostart.sh
drwxr-xr-x 2 root root 4096 Aug 7 01:02 LOG_HOME_IS_UNDEFINED
第一个字符 有时是-有时是d -表示是文件 d表示文件夹
后面的以3个长度进行拆分 rwx rwx rwx
rwx 4+2+1=7 表示最大权限7 包含 读r 写w 执行x
-rwxrwxrwx 1 root root 197 Aug 7 20:16 autostart.sh
中的-rwxrwxrwx 表示autostart.sh 是一个文件
第一组权限为“读写执行”,第二组权限为“读写执行”,第三组权限为“读写执行”
所以,使用此命令后,将 autostart.sh 权限变更为 读、写、执行,此时颜色为深黑色,且 ./autostart.sh 可以执行!
3、添加开机启动项
[root@VM_0_3_centos springbootdemo]# cd /etc/rc.d
[root@VM_0_3_centos rc.d]# ll
total 36
drwxr-xr-x. 2 root root 4096 Oct 18 2018 init.d
drwxr-xr-x. 2 root root 4096 Aug 4 2017 rc0.d
drwxr-xr-x. 2 root root 4096 Aug 4 2017 rc1.d
drwxr-xr-x. 2 root root 4096 Aug 4 2017 rc2.d
drwxr-xr-x. 2 root root 4096 Aug 4 2017 rc3.d
drwxr-xr-x. 2 root root 4096 Aug 4 2017 rc4.d
drwxr-xr-x. 2 root root 4096 Aug 4 2017 rc5.d
drwxr-xr-x. 2 root root 4096 Aug 4 2017 rc6.d
-rwxr-xr-x 1 root root 236 Aug 7 20:31 rc.local
在 rc.local 中添加执行脚本,在原始文件末尾追加
/root/springbootdemo/autostart.sh
后 保存并退出,完整为
[root@VM_0_3_centos rc.d]# cat rc.local
#!/bin/sh
/usr/local/qcloud/rps/set_rps.sh >/tmp/setRps.log 2>&1
/usr/local/qcloud/irq/net_smp_affinity.sh >/tmp/net_affinity.log 2>&1
/usr/local/qcloud/gpu/nv_gpu_conf.sh >/tmp/nv_gpu_conf.log 2>&1
/root/springbootdemo/autostart.sh
其中的 >/tmp/nv_gpu_conf.log 2>&1 表示不保存日志文件
4、重启服务器
reboot
5、编写守护进程脚本
[root@VM_0_3_centos springbootdemo]# vi hopdemo.sh
#! /bin/sh
pro_name='demo-0.0.1-SNAPSHOT.jar'
while true
do
NUM=`ps aux|grep ${pro_name} |grep -v greep|wc -l`
if [ "${NUM}" -lt "2" ];then
echo "重启项目"
nohup java -jar /root/springbootdemo/demo-0.0.1-SNAPSHOT.jar &
fi
#暂停时间按照具体的项目启动时间定义,时间太短,会导致单位时间内多个相同项目启动
sleep 10
done
exit 0
其中为什么判断条件中写入 -lt(小于) 2的判断
[root@VM_0_3_centos springbootdemo]# ps -ef|grep demo-0.0.1-SNAPSHOT.jar -wc
2
上述命令执行后,返回为查询到指定进程的数目信息。当然也可以让他返回指定有效进程的数目
[root@VM_0_3_centos springbootdemo]# ps aux | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep |wc -l
1
6、向开机自启脚本中,追加守护进程脚本信息
[root@VM_0_3_centos springbootdemo]# vi autostart.sh
#!/bin/sh
JAVA_HOME=/root/tools/javatool/jdk1.8.0_181
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME PATH
nohup java -jar /root/springbootdemo/demo-0.0.1-SNAPSHOT.jar &
echo "暂停30秒后 执行守护进程的启动"
sleep 30
# > /root/springbootdemo/hopdemo.txt 表示保存日志信息至指定文件,方便查看 最后一个&表示后台执行
nohup sh /root/springbootdemo/hopdemo.sh > /root/springbootdemo/hopdemo.txt &
#或者直接使用下列命令
#nohup sh /root/springbootdemo/hopdemo.sh &
这里注意几个小小的细节问题:摘自于<<在linux后台运行脚本的方法和命令>>
后台运行脚本
a.执行脚本test.sh:./test.sh
b.中断脚本test.sh:ctrl+c
c.在a的基础上将运行中的test.sh,切换到后台并暂停:ctrl+z
执行ctrl+z后,test.sh在后台是暂停状态(stopped),使用命令:bg number让其在后台开始运行(“number”是使用jobs命令查到的 [ ]中的数字,不是pid)
开放shell脚本的读、写、可执行权限
[root@VM_0_3_centos springbootdemo]# chmod 777 hopdemo.sh
7、如果中途我进行了项目更新,需要修改服务器上的项目,有守护进程在,如何能杀掉原来的项目部署新的项目呢?
查询守护进程的信息,杀掉守护进程
[root@VM_0_3_centos springbootdemo]# ps -ef|grep hopdemo.sh
root 7204 3338 0 11:27 pts/0 00:00:00 sh hopdemo.sh
root 12614 3338 0 12:01 pts/0 00:00:00 grep --color=auto hopdemo.sh
[root@VM_0_3_centos springbootdemo]# kill 3338
查询项目的进程,杀掉进程
[root@VM_0_3_centos springbootdemo]# ps -ef|grep java
root 19360 1 1 16:06 pts/1 00:00:13 java -jar /root/springbootdemo/demo-0.0.1-SNAPSHOT.jar
root 21515 10834 0 16:23 pts/0 00:00:00 grep --color=auto java
[root@VM_0_3_centos springbootdemo]# kill -9 19360
上传新的项目文件,重启守护进程shell脚本
[root@VM_0_3_centos springbootdemo]# sh hopdemo.sh
四、防火墙问题
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动