zoukankan      html  css  js  c++  java
  • Centos7设置定时任务执行脚本失败需设置环境变量

    写了一个服务重启的脚本,发现服务可以正常关闭,但是不能正常启动,参考文末博客解决此问题。

    问题描述

    写了一个服务重启脚本,手动执行发现可以正常的启停服务。

    执行脚本1,脚本名sps_noah_service.sh。

    #! /bin/bash
    echo "----开始执行noah/sps/tomcat/activemq服务脚本----"
    #"cd"后面接Linux系统中activemq的安装目录
    # cd /home/techbloom/activeMQ
    #以下定义三个方法分别直接进行tomcat的启动,关闭和重启
    start(){
       echo -e "33[32m====启动activemq应用====33[0m"
       cd /home/techbloom/activeMQ
       sh ./bin/activemq start >/dev/null 2>&1
       echo -e "33[32m====启动noah_install脚本====33[0m"
       cd /home/techbloom/Noah-App-install/bin
       sh ./noah.sh start >/dev/null 2>&1
       echo -e "33[32m====启动tomcat脚本====33[0m"
       cd /home/techbloom/tomcat8/bin
       sh ./startup.sh >/dev/null 2>&1
    }
    stop(){
       echo -e "33[32m====关闭activemq应用====33[0m"
       # sh ./bin/activemq stop >/dev/null 2>&1
       pids=`ps -ef|grep "activemq.jar"|grep -v "grep"|awk '{print $2}'`
       for pid in $pids
       do
           kill -9 $pid
       done
       echo -e "33[32m====关闭noah服务====33[0m"
       cd /home/techbloom/Noah-App-install
       sh ./bin/noah.sh stop
       echo -e "33[32m====关闭tomcat服务====33[0m"
       pids=`ps -ef|grep "Bootstrap"|grep -v "grep"|awk '{print $2}'`
       for pid in $pids
       do
           kill -9 $pid
       done
    }
    
    #以下定义一个可以根据参数调用上面三个方法的方法
    
    control(){
    action=$1
    case $action in
    start)
         start
         ;;
    stop)
         stop
         ;;
    *)
          echo "正常的参数应该是 start|stop|restart"
          echo "请重新正确执行脚本"
    esac
    }
    control $1
    

    执行脚本2,脚本名restart_rfidserver.sh,其调用了脚本1。

    #!/bin/bash
    cd /home/techbloom
    echo "----开始关闭rfid服务-`date "+%Y-%m-%d %H:%M:%S"`" >> /home/techbloom/restart_rfidserver_log.txt
    sh ./sps_noah_service.sh stop >> /home/techbloom/restart_rfidserver_log.txt
    sleep 1m
    cd /home/techbloom
    sh ./sps_noah_service.sh start >> /home/techbloom/restart_rfidserver_log.txt
    echo "----结束启动rfid服务-`date "+%Y-%m-%d %H:%M:%S"`" >> /home/techbloom/restart_rfidserver_log.txt
    

    手动执行脚本2,发现可以正常的关闭和启动服务。

    # 重启服务
    [root@node01 /home/techbloom]# sh restart_rfidserver.sh
    You have new mail in /var/spool/mail/root
    # 服务均已启动
    [root@node01 /home/techbloom]# jps
    2727 Bootstrap
    2712 activemq.jar
    2762 Jps
    2715 NoahServer_JVM
    

    但是将脚本执行加入到crontab定时任务里,发现只能关闭服务,但是不能启动服务。

    # crontab任务执行前
    [root@node01 /home/techbloom]# jps
    1856 NoahServer_JVM
    1904 Jps
    1868 Bootstrap
    1853 activemq.jar
    You have new mail in /var/spool/mail/root
    # 定时任务
    [root@node01 /home/techbloom]# crontab -l
    # 早上6点重启服务
    0 6 * * * sh /home/techbloom/restart_rfidserver.sh
    # 执行完后服务关闭了,但是没启动
    [root@node01 /home/techbloom]# jps
    2274 Jps
    

    问题排查

    将tomcat启动日志打印到本地,提示没有环境变量。由于关闭服务是通过进程号来关闭,所以不受影响,但是启动服务是通过执行服务启动脚本实现,需要加载当前环境变量。

    问题解决

    参考文末博文,在脚本里加入环境变量。原因是手动执行脚本2是在当前shell环境下进行的,脚本能找到环境变量。而系统自动执行任务调度时,是不会加载任何环境变量的,因此需要在脚本中指定任务运行所需的环境变量。

    #!/bin/bash
    # 加载环境变量
    source /etc/profile
    cd /home/techbloom
    echo "----开始关闭rfid服务-`date "+%Y-%m-%d %H:%M:%S"`" >> /home/techbloom/restart_rfidserver_log.txt
    sh ./sps_noah_service.sh stop >> /home/techbloom/restart_rfidserver_log.txt
    sleep 1m
    cd /home/techbloom
    sh ./sps_noah_service.sh start >> /home/techbloom/restart_rfidserver_log.txt
    echo "----结束启动rfid服务-`date "+%Y-%m-%d %H:%M:%S"`" >> /home/techbloom/restart_rfidserver_log.txt
    

    加入后,定时任务不仅可以关闭服务,也能启动服务了。

    参考博客:

    (1)https://www.cnblogs.com/youngchaolin/p/11722994.html

    (2)https://www.cnblogs.com/intval/p/5763929.html

  • 相关阅读:
    jvm调优
    Spring 事务
    Spring Framework入门介绍
    redis入门介绍
    Spring与SpringMVC重复扫描问题
    跨域相关问题
    Spring MVC介绍
    Servlet、Servlet容器
    获取屏幕宽高
    mybatis中比较符的写法
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/15330760.html
Copyright © 2011-2022 走看看