搜尋

首頁  >  問答  >  主體

virtualbox - Redis啟用密碼後Ubuntu虛擬機無法正常關機

我一直在虛擬機器中開發自己的伺服器程式。

Redis缺省是沒有密碼的,我啟用密碼後,發現虛擬機器無法正常關機。關機時Redis報告腳本密碼錯誤,並且一直死循環。

具體看截圖。有:(error) NOAUTH Authentication required.

但是我不知道redis停止腳本在哪裡。求幫助。

阿神阿神2797 天前1029

全部回覆(3)我來回復

  • 怪我咯

    怪我咯2017-04-25 09:04:50

    我也遇到一樣的問題。
    我當時的情況是:使用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 "" 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)
            rrreee stop
            rrreee start
            ;;
        *)
            echo "Please use start, stop, restart or status as first argument"
            ;;
    esac
    

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-25 09:04:50

    Redis可以通过客户端执行SHUTDOWN命令進行關閉。

    回覆
    0
  • 阿神

    阿神2017-04-25 09:04:50

    目前我暫時做了一個關閉Redis的腳本,關閉虛擬機器之前手動執行一次。有點兒搓。

    因為Shell程式設計不算熟悉,所以還需要學習一下您的腳本。不過redis-cli如果沒有金鑰應該會回傳NOAUTH錯誤,需要擷取後做判斷重新使用redis-cli+金鑰來關閉Redis。

    最後在/etc/init目錄中去尋找對應shutdown腳本看看如何整合。

    回覆
    0
  • 取消回覆