基于上篇博文 CentOS6.10 安装 redis-dump 小插曲继续下面的介绍
一, redis-dump 工具简单说明
退出 bash shell 窗口重新登录 bash
- [root@MQ1-S ~]# find / -name redis-dump
- /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump
- /usr/local/rvm/gems/ruby-2.3.7/gems/redis-dump-0.4.0/bin/redis-dump
未加载 rvm, 直接执行 redis-dump 时报错
- [root@MQ1-S ~]# /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump -u 192.168.2.106:10306 -a 'DH56ji2(3u4'> test.json
- /usr/local/rvm/rubies/ruby-2.3.7/lib/ruby/2.3.0/rubygems.rb:241:in `bin_path': can't find gem redis-dump (>= 0.a) (Gem::GemNotFoundException)
- from /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump:22:in `<main>'
于是重新加载 rvm 后再次执行 redis-dump 成功
- [root@MQ1-S ~]# source /usr/local/rvm/scripts/rvm
- [root@MQ1-S ~]# ruby --version
- ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
- [root@MQ1-S ~]# rvm --create ruby-2.3.7
- Using /usr/local/rvm/gems/ruby-2.3.7
- [root@MQ1-S ~]# ruby --version
- ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-linux]
- [root@MQ1-S ~]#
- [root@MQ1-S ~]# /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump -u 192.168.2.106:10306 -a 'DH56ji2(3u^4'> test.json
- [root@MQ1-S ~]#
- [root@MQ1-S ~]# du -sh test.json
- 87M test.json
- [root@MQ1-S ~]#
于是简单总结如下:
redis-dump 工具是基于 ruby 编写的脚本, 所以必须在 ruby 环境下才能执行此命令工具
所以在执行 redis-dump 命令前必须先加载 ruby 环境, source /etc/profile.d/rvm.sh 就是加载 ruby 环境或者是 source /usr/local/rvm/scripts/rvm
由于一开始服务器安装的 ruby 是 2.3.7 的版本 rvm install 2.3.7, 所以要切换到 ruby-2.3.7 下
rvm --create ruby-2.3.7
2.1, 原备份脚本:
- [root@MQ1-S scripts]# vim dump_redisdata.sh
- #!/bin/bash
- source /etc/profile.d/rvm.sh
- rvm --create ruby-2.3.7 &>/dev/null
- DATENOW=`date +%Y%m%d`
- DIR=/data1/backup/redisdb/"$DATENOW"
- DATETIME=`date +%H%M`
- if [ ! -d "$DIR" ]
- then
- mkdir -p $DIR
- fi
- /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump -u 192.168.2.106:10239 -a 'DJKjK0e=4' |gzip>"$DIR"/redis$DATETIME-json.gz
- oldDate=$(date -d "-6 days" "+%Y%m%d")
- cd /data1/backup/redisdb
- for folder in $(ls -d */)
- do
- [ ${folder%/*} -lt $oldDate ] && rm -rf $folder
- done
- 上面的脚本直接在 shell 执行时有问题的, 导致写入定时任务后, 备份 redis 数据失败
- 2.2, 失败的分析过程
- 先加载 ruby 环境以及切换到 ruby-2.3.7 下
- source /etc/profile.d/rvm.sh
- rvm --create ruby-2.3.7
- ruby --version
- [root@MQ1-S ~]# sh dump_redisdata.sh
- RVM is not a function, selecting rubies with 'rvm use ...' will not work.
- You need to change your terminal emulator preferences to allow login shell.
- Sometimes it is required to use `/bin/bash --login` as the command.
- Please visit https://rvm.io/integration/gnome-terminal/ for an example.
- 虽然 shell 界面还有 warn 输出, 但是查看 redis-dump 进程, 脚本已经成功运行,
- [root@MQ1-S 20180725]# ps -ef|grep redis-dump
- root 26675 26667 72 17:48 pts/3 00:00:14 /usr/local/rvm/rubies/ruby-2.3.7/bin/ruby /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump -u 192.168.2.106:10306 -a DH56ji2(3u^4
- root 26836 22679 0 17:49 pts/4 00:00:00 grep redis-dump
- [root@MQ1-S 20180725]#
- 但是不在服务器的 shell 命令行先执行命令加载 ruby 环境以及切换到 ruby-2.3.7 环境下 就直接在服务器 bash shell 命令行手动执行脚本, 就会报如下错, 脚本执行失败, 自动退出
- [root@MQ1-S ~]# sh dump_redisdata.sh
- /usr/local/rvm/rubies/ruby-2.3.7/lib/ruby/2.3.0/rubygems.rb:241:in `bin_path': can't find gem redis-dump (>= 0.a) (Gem::GemNotFoundException)
- from /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump:22:in `<main>'
- [root@MQ1-S ~]#
- RVM is not a function, selecting rubies with 'rvm use ...' will not work.
- You need to change your terminal emulator preferences to allow login shell.
- Sometimes it is required to use `/bin/bash --login` as the command.
- Please visit https://rvm.io/integration/gnome-terminal/ for an example.
- 已经足够说明未加载 rvm 和切换到 ruby2.3.7 环境下
- 直接把原来的备份脚本写入定时任务, 这也是备份脚本没执行成功的根本原因.
- 2.3, 关于 / bin/bash --login 的分析
- [root@MQ1-S ~]# sh dump_redisdata.sh
- RVM is not a function, selecting rubies with 'rvm use ...' will not work.
- You need to change your terminal emulator preferences to allow login shell.
- Sometimes it is required to use `/bin/bash --login` as the command.
- Please visit https://rvm.io/integration/gnome-terminal/ for an example.
- 虽然出现 / bin/bash --login 输出, 并不影响脚本的执行, 但是看着怪不舒服的. 于是想办法解决.
- 于是网上查资料, 才发现是服务器的环境变量加载的问题.
- 现在简单普及下环境变量的
- 关于环境变量的介绍:
- /etc/profile: 此文件为系统的每个用户设置环境信息, 当用户第一次登录时, 该文件被执行.
- 并从 / etc/profile.d 目录的配置文件中搜集 shell 的设置.
- /etc/bashrc: 为每一个运行 bash shell 的用户执行此文件. 当 bash shell 被打开时, 该文件被读取.
- ~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的 shell 信息, 当用户登录时, 该文件仅仅执行一次! 默认情况下, 他设置一些环境变量, 执行用户的. bashrc 文件.
- ~/.bashrc: 该文件包含专用于你的 bash shell 的 bash 信息, 当登录时以及每次打开新的 shell 时该文件被读取.
- ~/.bash_logout: 当每次退出系统 (退出 bash shell) 时, 执行该文件.
- 为了能做到在执行脚本前能够提前自动加载 ruby 的环境, 所以选择了~/.bashrc 加载这个环境变量的文件
- 同时要在这个文件后面添加下面 2 行代码来加载 ruby 换进变量
- [root@MQ1-S ~]# cat /root/.bashrc
- #.bashrc
- #User specific aliases and functions
- alias rm='rm -i'
- alias cp='cp -i'
- alias mv='mv -i'
- #Source global definitions
- if [ -f /etc/bashrc ]; then
- . /etc/bashrc
- fi
- #####
- [[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm"
- rvm --create ruby-2.3.7
- [root@MQ1-S ~]#
- 2.4, 修改后的成功的脚本
- [root@MQ1-S scripts]# cat dump_redisdata.sh
- #!/bin/bash
- . /root/.bashrc
- DATENOW=`date +%Y%m%d`
- DIR=/data1/backup/redisdb/"$DATENOW"
- DATETIME=`date +%H%M`
- if [ ! -d "$DIR" ]
- then
- mkdir -p $DIR
- fi
- redis-dump -u 192.168.2.106:10306 -a 'DH56ji2(3u^4' |gzip>"$DIR"/redis$DATETIME-json.gz
- oldDate=$(date -d "-6 days" "+%Y%m%d")
- cd /data1/backup/redisdb
- for folder in $(ls -d */)
- do
- [ ${folder%/*} -lt $oldDate ] && rm -rf $folder
- done
- 写入定时任务:
- [root@MQ1-S ~]# crontab -l|grep dump_redisdata.sh
- 12 17 * * */bin/bash /data/scripts/dump_redisdata.sh &>/dev/null
查看进程, 可知, 此时脚本已经可以写入定时任务自动执行了
- [root@MQ1-S ~]# ps -ef|grep redis-dump
- root 22250 22045 72 17:12 ? 00:00:22 /usr/local/rvm/rubies/ruby-2.3.7/bin/ruby /usr/local/rvm/gems/ruby-2.3.7/bin/redis-dump -u 192.168.2.106:2503 -a DP5HJKGF0
- root 22529 21776 0 17:12 pts/3 00:00:00 grep redis-dump
到此 redis-dump 备份 redis 数据脚本的修改完毕.
redis-dump 之 can't find gem redis-dump
来源: http://www.bubuko.com/infodetail-2700368.html