为了让redis-server能在系统启动时自动运行,需要将redis服务作为守护进程(daemon)来运行,我们回到/usr/redis/目录中找到一个redis.conf的文件,这个文件是redis服务运行时加载的配置,我们先观察一下其中的内容
[zhxilin@localhost redis]$ vi redis.conf
此文件内容非常长,但是大部分是注释,我们重点关注其中的几个设置daemonize和pidfile:
其中daemonize默认值是false,pidfile默认值是pidfile /var/run/redis_6379.pid
第一个表示是否daemon化,显然我们要把它改成daemonize yes;
第二个表示当服务以守护进程方式运行时,redis默认会把pid写入/var/run/redis_6379.pid文件,服务运行中该文件就存在,服务一旦停止该文件就自动删除,因而可以用来判断redis是否正在运行。
保存后退出。
有了基本配置,redis还需要有一个管理启动、关闭、重启的一个脚本。redis源码里其实已经提供了一个初始化脚本,位置在/usr/redis/utils/redis_init_script。
我们来看看这个脚本做了些什么:
#!/bin/sh#
# chkconfig:2345 90 10# description: Redis is a persistent key-value database
REDISPORT=6379EXEC=/lamp/redis-4.0.1/src/redis-server 我redis安装位置/lamp/redis-4.0.1CLIEXEC=/lamp/redis-4.0.1/src/redis-cliPIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
AUTH="1234"
case "$1" instart)if[ -f $PIDFILE ]then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."$EXEC $CONFfi;;
stop)if[ ! -f $PIDFILE ]then
echo "$PIDFILE does not exist, process is not running"
elsePID=$(cat$PIDFILE)echo "Stopping ..."$CLIEXEC-p $REDISPORT shutdownwhile[ -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
脚本中指定了端口、server路径、cli路径、pidfile路径以及conf路径,上述标黄的地方都需要正确配置,多说一句,如果在安装时执行了make
install,那么这里的脚本不需要做多大改动,因为make
install把server和cli都拷到/usr/local/bin下面了。
另外看到这里conf的路径,我们需要把redis目录下的redis.conf文件拷贝到/etc/redis/6379.conf
[root@localhost utils]# cd /etc
[root@localhost etc]#mkdirredis
[root@localhost etc]#cp /lamp/redis-4.0.1/redis.conf /etc/redis/6379.conf
接着将redis_init_script脚本拷贝到/etc/init.d/redisd
[root@localhost etc]# cpcp /lamp/redis-4.0.1/utils/redis_init_script /etc/init.d/redisd
在/etc/init.d下的脚本都是可以在系统启动是自动启动的服务,而现在还缺一个系统启动时的配置:
[root@localhost zhxilin]# chkconfig redisd on
然后就会发现报了一个错误:服务 redisd 不支持 chkconfig ?
#!/bin/sh
# chkconfig:2345 90 10# description: Redis is a persistent key-value database
保存完重新拷贝到/etc/init.d/redisd后,再运行chkconfig就完成了。
一切就绪之后,可以执行以下命令检验service是否设置成功:
[root@localhost zhxilin]# service redisd start
[root@localhost zhxilin]# service redisd stop
等价于
[root@localhost zhxilin]# /etc/init.d/redisd start
[root@localhost zhxilin]#/etc/init.d/redisd stop
最后重启一下系统吧,进入系统之后直接运行redis-cli检验redis服务是否已经自动运行了。
说明:
# chkconfig: 2345 10 90
表示通过chkconfig配置,在linux中2、3、4、5项中启动,这个2345代表就linux系统的启动顺序具体,具体内容是:等级0表示:表示关机、等级1表示:单用户模式、等级2表示:无网络连接的多用户命令行模式、等级3表示:有网络连接的多用户命令行模式、等级4表示:不可用、 等级5表示:带图形界面的多用户模式、 等级6表示:重新启动
如果看不明白,自己百度chkconfig命令详细说明。
# description: Start and Stop
redis
上面一句是描述
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
PATH是启动脚本使用的shell的搜索路径
REDISPORT=6379
REDISPORT指redis端口,启动redis使用
EXEC=/opt/redis-2.8.9/src/redis-server
安装redis后redis-server的绝对路径,在启动redis时使用
REDIS_CLI=/opt/redis-2.8.9/src/redis-cli
redis连接程序绝对路径,在关闭redis时使用
PIDFILE=/var/run/redis.pid
redis.conf配置文件中指定的pid路径地址,这里说明一下,在redis.conf配置文件中需要将daemonize这个参数项设置为
yes才会在redis启动时生成pid文件,很多新人不知道,没有生成pid文件,所以脚本里根据pid文件关闭redis就失败。
CONF="/etc/redis.conf"
redis启动配置文件,启动使用
AUTH="1234"
如果redis设置了登录密码,就需要这个配置,具体看下面介绍stop的章节
start)
#
这里判断PID文件是否存在,如果存在,就说明reids启动中或者运行异常,因为redis启动后会创建一个pid文件,如果正常关闭就会删除这个pid文件
if [ -f $PIDFILE
]
then
echo "$PIDFILE exists, process is already
running or crashed."
else
#
如果不存在pid文件,就启动reids,启动成功后提示 "Redis is
running..."
echo "Starting Redis server..."
$EXEC $CONF
fi
if [
"$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
#
在关闭reids的时候,如果pid文件不存在,就判断redis没有启动
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE exists, process is not
running."
else
##
-- 如果存在pid文件,就获取pid编号,然后登录到redis中,输入SHUTDOWN
来停止redis服务
PID=$(cat $PIDFILE)
echo "Stopping..."
## --
本节例子是redis有设置登录密码的例子,如果没有登录密码,下面的命令就去掉-a
$AUTH : $REDIS_CLI -p $REDISPORT
SHUTDOWN
$REDIS_CLI -p $REDISPORT -a $AUTH
SHUTDOWN
sleep 1
## --
循环判断pid文件是否存在,这里用的是是否可执行,道理一样,理解为程序是否停止就可以了,直到pid文件删除后,就说明redis关闭了。
while [ -x $PIDFILE
]
do
echo "Waiting for Redis to
shutdown..."
sleep 1
done
echo "Redis stopped"
fi
;;
最后说几个可能遇到的问题:
1.
如果启动脚本提示某个文件找不到,说明我们文件里的内容有误:比如cat $(PIDFILE)-x ${PIDFILE}
如果这些写在正常的指令或者字符串中正常,但是在判断表达式[]中就会出错
2.如果找不到pid文件,需要配置redis.conf配置中的选项打开。