crontab 无法正常读取环境变量
前提环境:
最近公司redis问题,决定写了个脚本自动恢复:
1、判断redis进程少于6个时:重启服务和创建集群,并自动刷缓存
2、判断redis中集群的个数,少于6个实例后,自动创建集群
脚本 及crontab :
脚本
vi create_cluster.sh
echo yes| /usr/local/redis-3.2.1/src/redis-trib.rb create --replicas 1 192.168.200.94:7001 192.168.200.94:7002 192.168.200.94:7003 192.168.200.94:7004 192.168.200.94:7005 192.168.200.94:7006
crontab内容
*/1 * * * * /usr/local/redis-3.2.1/cluster-conf/auto_Analysis_Recovery_redis_and_load_cache.sh >> /usr/local/redis-3.2.1/cluster-conf/Recovery_redis_and_load_cache-$(date +\%Y\%m\%d).log 2>&1 &
问题及处理
手工执行脚本是正常,crontab中执行报错:
/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/local/redis-3.2.1/src/redis-trib.rb:25:in `<main>'
网上的答案都是要安装gem insall redis
;自己查看确认是安装过的且版本正常。
手工能执行说明没有问题,那说明环境没有问题。问题就是在crontab 执行时
肯定是丢失
了一些信息;
crontab有一个坏毛病,就是不会默认从用户profile文件中读取环境变量参数,经常导致在手工执行某个脚本时是成功的,但是到crontab中试图让它定期执行时就是会出错.
看了这个就知道怎么修改脚本了,脚本的头上用缺省的#!/bin/sh就可以,然后然后第一个部分先写这些:
###################
. /etc/profile
. ~/.bash_profile
##################
脚本就变成了
vi create_cluster.sh
#!/bin/sh
. /etc/profile
. ~/.bash_profile
echo yes| /usr/local/redis-3.2.1/src/redis-trib.rb create --replicas 1 192.168.200.94:7001 192.168.200.94:7002 192.168.200.94:7003 192.168.200.94:7004 192.168.200.94:7005 192.168.200.94:7006
再次执行crontab 已经可以自动创建redis集群了。