我在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分钟运行一次。
我做错了什么?
我是否需要使用以下代替服务memcached restart?
/etc/init.d/memcached restart
我有另一个脚本,检查以确保我的lighttpd实例正在运行并且工作正常。它的工作方式略有不同,以验证它是否正在运行,但是使用init.d调用来重新启动。
编辑 - 解决方案:使用/etc/init.d/memcached restart解决了这个问题。
答案 0 :(得分:1)
通常导致crontab问题的是命令路径。在命令行中,命令的路径已经存在,但在cron中,它们通常不存在。如果这是您的问题,您可以通过在crontab的顶部添加以下行来解决它:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
这将提供cron显式路径以查找脚本运行的命令。
另外,你脚本中的shebang是错误的。它必须是:
#!/bin/bash
答案 1 :(得分:0)
我怀疑问题出在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
正在采取的行动。
答案 2 :(得分:0)
将以下代码另存为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。