redis基礎之開機自啟動和監聽(二)


redis安裝好后,每次手動啟動很不方便,配置開機自啟動。

方法一:設置啟動命令到/etc/rc.d/rc.local

  • rc.local文件是系統全局腳本文件,會在其他開機進程腳本文件執行完畢后執行該文件;

  • 直接在該文件末尾加入命令:

# start the redis-server
REDISPORT=6390
/usr/local/bin/redis-server "/etc/redis/redis_${REDISPORT}.conf"

  • 為rc.local增加可執行權限
sudo chmod +x /etc/rc.d/rc.local
  • 重新啟動主機測試一下,簡單粗暴。

方法二:利用redis自帶的開機自啟動腳本

  • 所有的Linux的啟動腳本文件都在/etc/rc.d/init.d下,主機啟動后會依次執行init.d下的所有的腳本文件;

  • redis自帶的開機自啟動腳本在utils文件夾下;

# 進入utils復制一份腳本文件到/etc/rc.d/init.d
cd utils
sudo cp redis_init_script /etc/rc.d/init.d/Sredis
# 打開Sredis修改腳本
sudo vi /etc/rc.d/init.d/Sredis
  • 根據redis.conf文件的配置修改腳本
#!/bin/sh
# chkconfig: 2345 80 90
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6390     # 對應redis.conf文件的端口
EXEC=/usr/local/bin/redis-server  # redis-server 文件的位置
CLIEXEC=/usr/local/bin/redis-cli  # redis-cli 文件的位置

PIDFILE=/var/run/redis_${REDISPORT}.pid  # 進程文件的位置
CONF="/etc/redis/redis_${REDISPORT}.conf"   # 配置文件的位置

case "$1" in
    start)
        if [ -f $PIDFILE ]  # 如果redis進程文件存在
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF  # $EXEC表示EXEC的值,命令:/usr/local/bin/redis-server "/etc/redis/redis_${REDISPORT}.conf"
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -h 192.168.1.22 -p $REDISPORT shutdown  # 該命令為  redis-cli -h ip地址 -p 端口 shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

  • 說明:

  • #! /bin/sh : # 表示注釋,但第一行#!表示指定使用哪個shell解釋器運行腳本

  • # chkconfig: 2345 80 90 : 使用chkconfig來管理

  • 為腳本添加可執行權限

sudo chmod +x Sredis
  • 測試
/etc/init.d/Sredis start
# 如果能順利啟動redis則成功
  • 注冊開機
# 將腳本添加到系統服務列表
chkconfig --add Sredis
# 打開自啟動開關
chkconfig Sredis on

# 查看所有注冊的腳本文件
chkconfig --list

  • 注意

  • 注冊時可能出現找不到文件的情況,一般是因為你是在window環境下編輯shell腳本的,在linux環境下,沒有這個問題,需要修改格式

sudo vi Sredis
: set ff=unix

問題

  • 設置redis開機自啟動腳本后,重啟一次主機,redis會把進程pid寫進/var/run/redis_6390.pid中;但是redis運行中如果執行了

  • /etc/rc.d/init.d/Sredis stop 或

  • redis-cli -h ip -p port shutdown ;redis_6390.pid文件會隨着redis-server退出而刪除;但是再次手動啟動redis-server,redis_6390.pid文件不會出現;

  • 另外如果redis運行中redis崩潰或執行了kill命令,redis_6390.pid文件不會被刪除,同時不會再記錄新的redis進程pid;

設置監聽

方法一:設置監聽腳本

  • redis一般作為緩存,運行過程如果出現崩潰或退出時不行的,需要一個腳本文件來監聽redis的運行;由於/var/run/redis_6390.pid文件的不確定性,不能使用其是否存在來監控redis的運行;每一個進程在/proc下有一個進程文件,針對redis的進程文件寫一個腳本Mredis.
#!/bin/sh
#chkconfig: 2345 10 90
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
 
REDISPORT=6390
EXEC=/usr/local/bin/redis-server
 
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis_${REDISPORT}.conf"

while [ 1 -gt 0 ]; do
    if [ -f $PIDFILE ]
    then
    echo "$PIDFILE exists"
    PID=$(cat $PIDFILE)
        if [ ! -f /proc/${PID} ]
        then
        PID1=$($EXEC $CONF | grep "pid=" | cut -d ":" -f 1)
        echo ${PID1} > $PIDFILE
        fi
    else
    echo "Starting Redis server..."
    $EXEC $CONF
    fi
    sleep 2
    done
  • 將文件放置到/etc/redis中
sudo mv Mredis /etc/redis/Mredis
  • 添加可執行權限
sudo chmod +x Mredis
  • 在rc.local中加入自啟動命令
sudo vi /etc/rc.d/rc.local

REDISPORT=6379
/etc/redis/Mredis_${REDISPORT}

方法二:提交cron任務

  • linux系統有一個專門用來管理定時任務的進程cron,一般是設置成開機自啟動的,可以通過以下命令查看
ps aux | grep cron
  • 關於cron任務的細節參考:cron任務介紹

  • 第一步:編輯一個crontab文件

# 進入redis的utils文件
cd /usr/local/redis/utils
touch redis_minute
vi redis_minut
SHELL=/bin/bash

# set a minute of redis.conf
*/1 * * * * /etc/redis/Mredis_6390

  • 修改Mredis_6390腳本文件
#! /bin/sh
# chkconfig: 2345 80 90
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6390
EXEC=/usr/local/bin/redis-server

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis_${REDISPORT}.conf"

if [ -f $PIDFILE ]
    then
    echo "$PIDFILE exists"
    PID=$(cat $PIDFILE)
        if [ ! -x /proc/${PID} ]
        then
        PID1=$($EXEC $CONF | grep "pid=" | cut -d ":" -f 1)
        echo ${PID1} > $PIDFILE
        fi
    else
    echo "Starting Redis server..."
    $EXEC $CONF
fi

  • 第二步:提交任務
crontab redis_minute
  • 第三步:查看任務
crontab -l 
service crond restart  # 重啟cron服務

生產環境下的redis的啟動和監聽

  • 上述的啟動和監聽方法在測試或練習的時候可用,但生產環境下涉及大量的進程管理,這時就不合適了,需要專門的進程管理工具,樓主使用的是supervisor.

  • supervisor的安裝配置參考:http://www.cnblogs.com/cwp-bg/p/8623132.html

  • supervisor是不能管理守護進程的,因此需要設置redis的配置參數。

vi redis.conf

# 將daemonize設置為 no,在前台運行
daemonize no

  • 在supervisor配置文件中加入redis配置。
touch /etc/supervisor/super.d/redis.ini
chmod 644 /etc/supervisor/super.d/redis.ini

# 編輯
vi redis.ini

[program:redis_6390]
command=/usr/local/bin/redis-server /etc/redis/6390.conf
stdout_logfile=/var/log/redis_6390_out.log
stderr_logfile=/var/log/redis-6390_err.log

# supervisord.conf加入include上述文件
[include]
files = /etc/supervisor/super.d/redis.ini

# 重新載入
supervisorctl update


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM