virtualbox - Redis啟用密碼後Ubuntu虛擬機無法正常關機
阿神
阿神 2017-04-25 09:02:50
0
3
942

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

  • VirtualBox V5

  • Ubuntu Server 12.04LTS 32bit

  • Python 2.7.3

  • MySQL 5.5

  • Redis

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

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

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

阿神
阿神

闭关修行中......

全部回覆(3)
刘奇

我也遇到一樣的問題。
我當時的情況是:使用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
Ty80

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

阿神

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

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

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!