virtualbox - Redis使能密码后Ubuntu虚拟机无法正常关机

 落了个小妞农_602 发布于 2022-10-25 03:51

我一直在虚拟机中开发自己的服务器程序。

  • VirtualBox V5

  • Ubuntu Server 12.04LTS 32bit

  • Python 2.7.3

  • MySQL 5.5

  • Redis

Redis缺省是没有密码的,我使能密码后,发现虚拟机无法正常关机。关机时Redis报告脚本密码错误,并一直死循环。

具体看截图。有:(error) NOAUTH Authentication required.

但是我不知道redis停止脚本在哪里。求帮助。

3 个回答
  • 目前我暂时做了一个关闭Redis的脚本,关闭虚拟机之前手动运行一次。有点儿搓。

    因为Shell编程不算熟悉,所以还需要学习一下您的脚本。不过redis-cli如果没有密钥应该会返回NOAUTH错误,需要捕获后做判断重新使用redis-cli+密钥来关闭Redis。

    最后在/etc/init目录中去寻找对应shutdown脚本看看如何整合。

    2022-10-26 14:11 回答
  • Redis可以通过客户端执行SHUTDOWN命令进行关闭。

    2022-10-26 14:11 回答
  • 我也遇到过一样的问题。
    我当时的情况是:使用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-server
    CLIEXEC=/usr/local/bin/redis-cli
    PIDFILE=/var/run/redis_<%= name %>.pid
    CONF="/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 INFO
    
    
    case "$1" in
        start)
            if [ -f $PIDFILE ]
            then
                echo "$PIDFILE exists, process is already running or crashed"
            else
                echo "Starting Redis_$REDISPORT server..."
                $EXEC $CONF
            fi
            ;;
        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} ]
                do
                    echo "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"
              fi
            else
              echo 'No PID File,Redis_$REDISPORT is not running'
              exit 1
            fi
            ;;
        restart)
            $0 stop
            $0 start
            ;;
        *)
            echo "Please use start, stop, restart or status as first argument"
            ;;
    esac
    
    2022-10-26 14:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有