用于重新启动 memcached 的 Cron 脚本不起作用

Posted

技术标签:

【中文标题】用于重新启动 memcached 的 Cron 脚本不起作用【英文标题】:Cron script to restart memcached not working 【发布时间】: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 解决了这个问题。

【问题讨论】:

【参考方案1】:

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

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

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

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

#!/bin/bash

【讨论】:

谢谢。你是对的 - sbin 不在 cron 的路径中,所以“服务”不起作用。 ***.com/questions/8127433/…【参考方案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。

【讨论】:

以上是关于用于重新启动 memcached 的 Cron 脚本不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从 cron 重新启动弹性 beanstalk 应用程序服务器

在cron上重新启动apache

unix cron pptp重新启动

有没有办法使用cron重新启动pm2进程但是只有它还没有运行?

Memcached 兼容持久化工具

在我在docker容器中重新保存cron文件之前,Cron作业不起作用