virtualbox - Redis使能密码后Ubuntu虚拟机无法正常关机
问题描述
我一直在虚拟机中开发自己的服务器程序。
VirtualBox V5
Ubuntu Server 12.04LTS 32bit
Python 2.7.3
MySQL 5.5
Redis
Redis缺省是没有密码的,我使能密码后,发现虚拟机无法正常关机。关机时Redis报告脚本密码错误,并一直死循环。
具体看截图。有:(error) NOAUTH Authentication required.
但是我不知道redis停止脚本在哪里。求帮助。
问题解答
回答1:我也遇到过一样的问题。我当时的情况是:使用puppet做redis的自动下发和部署,在为redis启用认证密码后,在puppet中关闭服务,puppet会卡死无法继续。后来手动定位问题也发现了同样的事情。原因其实是redis作者在源码包里提供的服务控制脚本没有考虑到加认证密码后如何关闭服务。带密码的关闭方式是:redis-cli -p 端口 -a 密码 shutdown因为我是用puppet做redis的部署,所以把这个脚本做成了puppet文件模板,如果加了密码就会自动修改服务控制脚本。我把模板贴上来,希望有所帮助。
#!/bin/sh#Configurations injected by install_server below....EXEC=/usr/local/bin/redis-serverCLIEXEC=/usr/local/bin/redis-cliPIDFILE=/var/run/redis_<%= name %>.pidCONF='/etc/redis/<%= name %>.conf'REDISPORT='<%= name %>'################ SysV Init Information# chkconfig: - 58 74# description: redis_<%= name %> is the redis daemon.### BEGIN INIT INFO# Provides: redis_<%= name %># Required-Start: $network $local_fs $remote_fs# Required-Stop: $network $local_fs $remote_fs# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Should-Start: $syslog $named# Should-Stop: $syslog $named# Short-Description: start and stop redis_<%= name %># Description: Redis daemon### END INIT INFOcase '$1' in start)if [ -f $PIDFILE ]then echo '$PIDFILE exists, process is already running or crashed'else echo 'Starting Redis_$REDISPORT server...' $EXEC $CONFfi;; stop)if [ ! -f $PIDFILE ]then echo '$PIDFILE does not exist, process is not running'else PID=$(cat $PIDFILE) echo 'Stopping ...' <% if @password == ’nopass’ -%> $CLIEXEC -p $REDISPORT shutdown <% else -%> $CLIEXEC -p $REDISPORT -a <%= @password %> shutdown <% end -%> while [ -x /proc/${PID} ] doecho 'Waiting for Redis_$REDISPORT to shutdown ...'sleep 2 done echo 'Redis_$REDISPORT stopped'fi;; status)PID=$(cat $PIDFILE)if [ -f $PIDFILE ]then if [ ! -x /proc/${PID} ] then echo ’Redis_$REDISPORT is not running’ rm -rf $PIDFILE exit 1 else echo 'Redis_$REDISPORT is running' fielse echo ’No PID File,Redis_$REDISPORT is not running’ exit 1fi;; restart)$0 stop$0 start;; *)echo 'Please use start, stop, restart or status as first argument';;esac回答2:
Redis可以通过客户端执行SHUTDOWN命令进行关闭。
回答3:目前我暂时做了一个关闭Redis的脚本,关闭虚拟机之前手动运行一次。有点儿搓。
因为Shell编程不算熟悉,所以还需要学习一下您的脚本。不过redis-cli如果没有密钥应该会返回NOAUTH错误,需要捕获后做判断重新使用redis-cli+密钥来关闭Redis。
最后在/etc/init目录中去寻找对应shutdown脚本看看如何整合。
相关文章:
1. javascript - js一个call和apply的问题?2. 老师,请问我打开browsersync出现这个问题怎么解决啊?3. docker不显示端口映射呢?4. mysql - 数据库为什么需要锁机制?5. javascript - 给某个类添加一个伪类,这个类有click事件,现在我点击伪类也触发了click事件6. android - 类似这样的recyclerview滑动效果7. java - ssm整合 表现层访问时报错。。8. node.js - JavaScript的一个不能理解的地方9. docker镜像push报错10. python - xpath提取网页路径没问题,但是缺失内容?
