【问题标题】:Cron script to restart memcached not working用于重新启动 memcached 的 Cron 脚本不起作用
【发布时间】:2016-02-16 14:55:24
【问题描述】:

我在 cron 中有一个脚本来检查 memcached,如果它不起作用则重新启动它。由于某种原因,它无法正常工作。 脚本,有权限:

-rwxr-xr-x  1 root     root       151 Aug 28 22:43 check_memcached.sh

crontab 条目:

*/5 * * * *  /home/mysite/www/check_memcached.sh  1> /dev/null 2> /dev/null

脚本内容:

#!/bin/sh

ps -eaf | grep 11211 | grep memcached
if [ $? -ne 0 ]; then
        service memcached restart
else
        echo "eq 0 - memcache running - do nothing"
fi

如果我从命令行运行它,它工作正常,但昨晚 memcached 崩溃并且它没有从 cron 重新启动。我可以看到 cron 每 5 分钟运行一次。

我做错了什么?

是否需要使用以下内容而不是 service memcached restart?

/etc/init.d/memcached restart

我有另一个脚本可以检查以确保我的 lighttpd 实例正在运行并且工作正常。验证它是否正在运行时,它的工作方式略有不同,但它使用 init.d 调用来重新启动。

编辑 - 解决方法:使用 /etc/init.d/memcached restart 解决了这个问题。

【问题讨论】:

    标签: linux bash cron memcached


    【解决方案1】:

    通常导致 crontab 问题的是命令路径。在命令行中,命令的路径已经存在,但在 cron 中它们通常不存在。如果这是您的问题,您可以通过在 crontab 顶部添加以下行来解决它:

     PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    

    这将为 cron 提供显式路径,以查找脚本运行的命令。

    另外,脚本中的 shebang 是错误的。它必须是:

    #!/bin/bash
    

    【讨论】:

    【解决方案2】:

    我怀疑问题出在grep 11211 - 不清楚数字的含义,grep 可能与所需的进程不匹配。

    我认为您需要记录此脚本的操作 - 然后您会看到实际发生的情况。

    #!/bin/bash
    
    exec >> /tmp/cronjob.log 2>&1
    set -xv
    
    cat2 () { tee -a /dev/stderr; }
    
    ps -ef | cat2 | grep 11211 | grep memcached
    if [ $? -ne 0 ]; then
            service memcached restart
    else
            echo "eq 0 - memcache running - do nothing"
    fi
    
    exit 0
    

    set -xv 输出被捕获到/tmp 中的日志文件中。 cat2 会将stdin 复制到日志文件中,因此您可以看到grep 的作用。

    【讨论】:

    • 我试过了——它在 cronjob.log 文件中吐出“什么都不做”文本,因为它正在运行。11211 是 memcached 运行的端口。运行 memcached 的启动命令是 memcached -d -p 11211 -u memcached -m 512 -c 1024 -P /var/run/memcached/memcached.pid 所以它会匹配。
    • 何不手动kill掉,看看cron作业是否重启?
    • 我不得不等到我的网站上的低时间,但它现在可以使用 /etc/init.d/memcached restart 我使用服务收到的消息是:/home/mysite/www/check_memcached。 sh:第 10 行:服务:找不到命令
    【解决方案3】:

    将以下代码另存为 check_memcached.sh

    #!/bin/bash
    
    MEMCACHED_STATUS=`systemctl is-active memcached.service`
    if [[ ${MEMCACHED_STATUS} == 'active' ]]; then
        echo " Service running.... so exiting "  
        exit 1
    else
        service memcached restart
    fi
    

    您可以将其安排为 cron。

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 2018-08-26
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2014-09-09
      • 2012-11-07
      • 2017-08-15
      相关资源
      最近更新 更多