zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Java之ServiceLoader
    docker学习(3)--Dockfile详解
    docker学习(2)--基础命令
    docker学习(1)--基础概念
    dubbo学习(1)--简单的入门搭建实例
    Flume搭建及学习(基础篇)
    VM下--Linux根分区磁盘扩容
    Windows10下简单搭建zookeeper
    Windows10下搭建TensorFlow环境
    cmath库函数
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/8274211.html
Copyright © 2011-2022 走看看