我一直在虛擬機器中開發自己的伺服器程式。
VirtualBox V5
Ubuntu Server 12.04LTS 32bit
Python 2.7.3
MySQL 5.5
Redis
Redis缺省是沒有密碼的,我啟用密碼後,發現虛擬機器無法正常關機。關機時Redis報告腳本密碼錯誤,並且一直死循環。
具體看截圖。有:(error) NOAUTH Authentication required.
但是我不知道redis停止腳本在哪裡。求幫助。
怪我咯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
阿神2017-04-25 09:04:50
目前我暫時做了一個關閉Redis的腳本,關閉虛擬機器之前手動執行一次。有點兒搓。
因為Shell程式設計不算熟悉,所以還需要學習一下您的腳本。不過redis-cli如果沒有金鑰應該會回傳NOAUTH錯誤,需要擷取後做判斷重新使用redis-cli+金鑰來關閉Redis。
最後在/etc/init目錄中去尋找對應shutdown腳本看看如何整合。