Redis沒有默認的服務腳本,方便管理的情況下需要自定義一個服務腳本,對於實例的啟動好說,對於關閉Redis進程,有兩種方式
1,直接殺進程,kill -9的方式,過於簡單粗暴
2,基於redis-cli shutdown的方式,需要數據密碼(如果腦子沒問題都會啟用密碼認證)
網上的兩個版本,對於啟動redis進程來說,是比較簡單的,第一種是簡單粗暴通過kill進程的方式,第二種是redis-cli shutdown但是是基於無密碼的方式的,都不實用,白嫖是不可能白嫖的了。
於是就簡單改寫了一個基於密碼認證的redis-cli shutdown方式,開啟了密碼認證的情況下,在stop或者restart的時候,輸入一個密碼參數,並且驗證密碼的有效性,然后基於redis-cli shutdown關閉/重啟實例。
這里是Redis服務的模板,
1,基於當前實例的端口號判斷服務狀態,而不是pid文件,因為如果通過kill方式殺掉的進程,pid文件仍然會存在於文件中。
2,在stop或者restart的時候,需要對密碼參數進行驗證
3,在執行redis-cli shutdown的時候,如果密碼出錯,也需要進行驗證,這里基於錯誤密碼驗證失敗后的NOAUTH Authentication required.關鍵字進行判斷
#!/bin/sh # chkconfig: 2345 10 90 # description: Start and Stop redis port=db_port basedir=base_dir datadir=data_dir conf=data_dir/redis.conf case "$1" in start) process=`netstat -ntl|grep $port | wc -l` if [ $process -eq 0 ] then cd ${datadir} $basedir/bin/redis-server ./redis.conf& if [ $? -eq 0 ]; then echo "Starting Redis server sucefully" else echo "Starting Redis server fail,refer to the log information for details" fi else echo "Port "$port is exists, process is already running"" fi ;; stop) if [ ! $2 ];then echo "Redis password is required" exit -1 fi process=`lsof -i:$port -t` if [ $process ]; then echo "Stopping ..." #kill -9 $process #$basedir/bin/redis-cli -p $port -a $2 shutdown msg=`$basedir/bin/redis-cli -a $2 -p $port shutdown` result=$(echo $msg | grep "Authentication") if [[ "$result" = "" ]]; then while [ -x /proc/${process} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" else echo "Authentication failed,please check redis password" exit -1 fi else echo "Process is not running" fi ;; restart) process=`lsof -i:$port -t` if [ $process ]; then "$0" stop $2 if [ $? -eq 0 ]; then "$0" start fi else "$0" start fi ;; *) echo "Please use start or stop or restart as first argument" ;; esac
安裝過程中替換相關的變量
#!/bin/bash #sh redis_install.sh /usr/local/redis_install /usr/local/redis_instance/redis8000/ redis-5.0.4 8000 192.168.0.66 set -e if [ $# -lt 4 ]; then echo "$(basename $0): Missing script argument" echo "$(installdir $0) [installfilename] [port] " exit 9 fi PotInUse=`netstat -anp | awk '{print $4}' | grep $4 | wc -l` if [ $PotInUse -gt 0 ];then echo "ERROR" $4 "Port is used by another process!" exit 9 fi basedir=${1%/} installdir=${2%/} installfilename=${3%/} port=$4 bind_ip=$5 cd $basedir echo "Unzip installation package " tar -zxvf $installfilename.tar.gz >/dev/null 2>&1 & sleep 1s mkdir -p $installfilename cd $installfilename mkdir -p $installdir echo "Compile installation package" make PREFIX=$basedir install >/dev/null 2>&1 & sleep 1s cp $basedir/redis.conf $installdir sed -i "s/instance_port/$port/g" $installdir/redis.conf sed -i "s/bind_ip/$bind_ip/g" $installdir/redis.conf cd $basedir cp -f redis_6379 /etc/init.d/redis_$port sed -i "s/db_port/$port/g" /etc/init.d/redis_$port sed -i "s/base_dir/${basedir//\//\\/}/g" /etc/init.d/redis_$port sed -i "s/data_dir/${installdir//\//\\/}/g" /etc/init.d/redis_$port chmod +x /etc/init.d/redis_$port sleep 1s echo "Start redis service" cd $installdir $basedir/bin/redis-server redis.conf >/dev/null 2>&1 & if [ $? -eq 0 ]; then echo "Starting Redis server sucefully" else echo "Starting Redis server fail,refer to the log information for details" fi
簡單基於服務模式啟動,關閉,重啟redis服務,以及密碼正確性驗證