首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
V2EX  ›  Linux

问下 shell 大佬们, crontab 定时任务执行 shell 脚本和自己手动执行 shell 脚本 为何结果不一致?

  •  
  •   skypyb · 38 天前 · 1476 次点击
    这是一个创建于 38 天前的主题,其中的信息可能已经有所发展或是发生改变。

    定时任务:

    */1 * * * * bash /opt/rocket/bin/monitor.sh
    

    shell 脚本代码如下:

    #!bin/bash
    source ~/.bash_profile
    
    LOG_FILE='/opt/rocket/bin/logs/monitor_sh.log'
    
    # 打印日志,传一个参数($1 日志体)
    function log() {
      local time=$(date "+%Y-%m-%d %H:%M:%S")
      echo "[$time] $0 : $1 " >> ${LOG_FILE}
    }
    
    # 用来搜进程有几条,没有就返回 0
    # $1 : 进程名
    function checkProcess() {
        if [ -z $1 ];
        then
            log "Input parameter is empty."
            return 0
        fi
    
        pid=`ps -ef | grep "rocket" | grep -v grep | awk '{print $2}'`
        echo $pid
    }
    
    
    declare -i pid #声明变量为整形
    pName="rocket" #要查看的进程名
    
    pid=`checkProcess ${pName}`
    if [ $pid -eq 0 ]
    then
        log "No specified ${pName} service starts."
        bash start.sh
    else
        log "The specified service ${pName} has been started, pid=${pid}."
    fi
    

    日志文件(部分)如下:

    • [2019-07-17 16:57:54] monitor.sh : The specified service rocket has been started, pid=15460.
    • [2019-07-17 16:58:01] /opt/rocket/bin/monitor.sh : No specified rocket service starts.
    • [2019-07-17 16:58:45] monitor.sh : The specified service rocket has been started, pid=15460.
    • [2019-07-17 16:59:01] /opt/rocket/bin/monitor.sh : No specified rocket service starts.
    • [2019-07-17 17:00:01] /opt/rocket/bin/monitor.sh : No specified rocket service starts.
    • [2019-07-17 17:01:01] /opt/rocket/bin/monitor.sh : No specified rocket service starts.
    • [2019-07-17 17:01:16] monitor.sh : The specified service rocket has been started, pid=15460.
    • [2019-07-17 17:02:01] /opt/rocket/bin/monitor.sh : No specified rocket service starts.
    • [2019-07-17 17:03:01] /opt/rocket/bin/monitor.sh : No specified rocket service starts.
    • [2019-07-17 17:04:01] /opt/rocket/bin/monitor.sh : No specified rocket service starts.
    • [2019-07-17 17:05:01] /opt/rocket/bin/monitor.sh : No specified rocket service starts.

    shell 脚本用途是检测 java 进程是否存在,若不存在就执行另一个启动脚本,此处场景是存在的,即我手动执行时打印的 15460 号

    看日志打印的文件名, 只有文件名 monitor.sh 的是我手动执行的,绝对路径是定时任务执行的。
    那么问题来了,这是个什么情况? 如何解决?

    19 回复  |  直到 2019-07-19 09:24:18 +08:00
        1
    skypyb   38 天前
    写 shell 脚本不多 , 也不知道是不是我写的代码有问题?
        2
    vcheckzen   38 天前 via Android
    start.sh 也用绝对路径看看
        3
    skypyb   38 天前
    @vcheckzen
    按照逻辑来说进入这个能执行 start.sh 的代码块就已经错误了 = =
    正常情况应该是进 else 的,毕竟已经有对应进程在执行了
        4
    hell0v2   38 天前
    看看环境变量是否有影响,cron 用户执行的环境变量不一致可能会导致失败,在定时任务里直接加. /etc/profile 或. ~/.bash_profile 试试呢
        5
    ant2017   38 天前 via Android
    checkProcess()这个函数查询 pid 的时候有问题吧,这样只 grep rocket 不是会查询到多个 pid 吗?
        6
    skypyb   38 天前
    @hell0v2 代码第二行就是呀,没有作用。。
        7
    reticentfat   38 天前 via iPhone
    环境变量不一致
        8
    omph   38 天前
    为何不用 pgrep ?
        9
    vcheckzen   38 天前 via Android
    把 checkProcess 里的 pid 打到 log 看看
        10
    newtype0092   38 天前
    sudo -u xxx /bin/bash /opt/rocket/bin/monitor.sh
        11
    skypyb   38 天前
    @ant2017 一般不会,这服务器里包含这个名字的就他一个 jar 包。有可能查出多个话,那我也不知道该用什么命令了= =

    @omph 因为我没有听过呢...

    @reticentfat 如果是环境变量的锅,我应该如何设置呢? 是不是我代码第二行书写错误。
        12
    newtype0092   38 天前
    你先用你的账号,比如说 xxx,试下是否正常,所有的命令都用全路径,比如 /bin/bash
    crontab 里执行的时候也用 sudo -u 切换到你的 xxx 用户,保证环境变量完全一致
        13
    Alphabetcn   38 天前 via Android
    set -ex & crontab 输出从定向到某个文件看看
        14
    aocif23   38 天前
    看到了相对路径,想起了以前踩过的坑。。。cron 执行的脚本里全换成绝对路径,包括安装的程序。
        15
    ant2017   38 天前 via Android
    @skypyb 绝对路径里面有 rocket,你手动绝对路径拉一下
        16
    epicSoldier   38 天前
    应该是环境变量的问题,可以看一下 /var/mail/user 里的日志会打印 cron 执行时的环境变量
        17
    zheng5200   38 天前
    在 crontab 执行中最好用服务器的绝对路径,我以前就被这个坑过。。。
        18
    oneisall8955   38 天前 via Android
    crontab 里面用绝对路径 /bin/bash 执行,并把 crontab 里面加上重定向日志,看看执行有没有错误。最后监控脚本林也用绝对路径执行 start.sh 试试?
        19
    hell0v2   37 天前
    @skypyb 是 cron 行里加入,不是脚本里加
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2054 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 04:25 · PVG 12:25 · LAX 21:25 · JFK 00:25
    ♥ Do have faith in what you're doing.