Luo Hao

Linux——开机启动和后台运行

rehoni / 2022-09-21


执行脚本

流程:后台运行脚本调用自启动脚本,判断执行脚本是否正在运行,调用执行脚本。

创建xxxx.sh脚本包装java -jar命令的执行

 cd /users/ems/Jar/imp
 java -jar -Xms1024m -Xmx1536m -XX:PermSize=512m -XX:MaxPermSize=2048m imp.jar -propath imp.properties > /users/ems/Jar/logs/imp-logs.txt
 
 # -vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了
 # -Xms128m JVM初始分配的堆内存
 # -Xmx512m JVM最大允许分配的堆内存,按需分配
 # -XX:PermSize=64M JVM初始分配的非堆内存
 # -XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配

自启脚本

 start_ratio(){
     sh /users/ems/Jar/bin/ratio.sh &
     sleep 120
 }
 
 stop_ratio(){
     PROCESS=`ps -ef |grep ratio.jar|grep -v grep|grep -v PPID|awk '{ print $2}'`
     for i in $PROCESS
     do
       echo ">>>RatioExec is running!begin to shutdown..."
       echo "Kill the process [ $i ]"
       kill -9 $i
     done
 }
 
 restart_ratio(){
     stop_ratio
     start_ratio
 }
 
 COUNT=$(ps -ef |grep ratio.jar |grep -v "grep" |wc -l)
 
 while true;do
     if [ $COUNT -eq 0 ]; then
         echo ">>>Ratio is not ok!begin to restart ratio..."
         echo "count:"$COUNT
         restart_ratio
     elif [ $COUNT -gt 1 ]; then
         echo ">>>Ratio is running so many!begin to kill all and restart ratio..."
         echo "count:"$COUNT
         restart_ratio
     else
         echo ">>>Only 1 ratio is running!"
     fi
 
     sleep 60
 done

通过COUNT线程数量来判断是否有多个java进行在执行,来决定是否清除多余的java进程。

sleep是用来间歇性地判断程序是否有执行完,判断周期,让程序跑一会儿。

考虑到有些程序可以通过判断http的响应,执行程序的运行和停止。

 get_http_status()
 {
     http_code=`curl --head -o /dev/null --silent --max-time 20 --connect-timeout 20 -w %{http_code} $1`
     return $http_code
 }
 
 
 #########Start Zuul && Eureka##########################
 zuulUrl="<http://localhost:8001/info>"
 eurekaUrl="<http://localhost:8000/info>"
 
 ############check NrCloud#############################
 while true; do
     #check and restart eureka
     get_http_status $eurekaUrl
     status=$?
     if [ $status -eq 200 ]; then
         echo ">>>Eureka is ok!"
     else
         echo ">>>Eureka is not ok!begin to restart Eureka..."
         echo "http_status:"$status     
         restart_eureka        
     fi
     
     #check and restart zuul
     get_http_status $zuulUrl
     status=$?
     if [ $status -eq 200 ]; then
         echo ">>>Zuul is ok!"
     else
         echo ">>>Zuul is not ok!begin to restart Zuul..."
         echo "http_status:"$status     
         restart_zuul        
     fi
         
     sleep 30
 done

后台运行脚本

创建后台运行脚本java_exec.csh来包装自启脚本

 #!/bin/csh
 nohup /users/ems/Jar/bin/self_restart_ratio.sh &

nohup配合&命令,能够实现后台一直运行该程序/脚本。可以通过ps -ef | grep 关键字来确认该脚本是否正在运行。上边的执行脚本也是。

自定义开机程序

编辑文件 /etc/rc.local

修改 /etc/rc.d/rc.loacl (/etc/rc.local)文件,在文件末尾(exit 0之前)加上你开机需要启动的程序或执行的命令即可(执行的程序需要写绝对路径,添加到系统环境变量的除外)

通过chkconfig命令设置

将启动文件cp到 -或者/etc/rc.d/init.d/(前者是后者的软连接)下

vim 启动文件,文件前面务必添加如下三行代码,否侧会提示chkconfig不支持

 #!/bin/sh 告诉系统使用的shell,所以的shell脚本都是这样
 #chkconfig: 35 20 80 分别代表运行级别,启动优先权,关闭优先权,此行代码必须
 #description: http server(自己随便发挥)//两行都注释掉!!!,此行代码必须

chkconfig –add 脚本文件名 操作后就已经添加了

注意

如果在服务器中执行的时候,提示权限不足

 chmod 777 ./imp.sh