我正在按照在生产计算机上安装Redis的说明(使用chkconfig的CentOS)。
我给出的示例脚本需要参数start
来实际启动它,它似乎是init.d不执行的操作(传递参数)。
必须运行的真实命令是/etc/init.d/redis_6379 start
,但其实际调用的是/etc/inti.d/redis_6379
,它只是说use start or stop as an argument
因此,当我的服务器重新启动时,它实际上并不启动redis。我该怎么办?
这是初始配置
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
#
# chkconfig: - 85 15
# description: Redis is a persistent key-value database
# processname: redis_6379
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT 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
答案 0 :(得分:4)
确保chkconfig
添加了脚本以进行服务管理。使用chkconfig --list
查看列表,如果不存在,请使用chkconfig --add scriptname
。之后配置您希望它被调用的运行级别。我猜它是3,4和5所以:chkconfig --level 345 scriptname on
。
答案 1 :(得分:1)
您应该告诉我们您是如何从init.d运行脚本的
但这是一个肮脏的解决方法:
更改行
start)
到
start|'')
如果没有传递参数,这将启动它。
答案 2 :(得分:1)
如果您想通过命令行启动服务,您也可以添加/etc/rc.d/rc.local
,而不是在init.d中创建服务文件。
答案 3 :(得分:0)
Centos redis有一个带有chkconfig标题行的init脚本,声明它将在所有运行级别中启动,这非常糟糕。 chkconfig用于管理/etc/rc.d
中的符号链接# chkconfig: - 85 15
我建议redis是在关键服务启动后运行在3级的服务(例如sshd)。在您的测试场景中,在开始生产之前重新启动服务器。如果redis无法启动(刚刚发生在此处),则无法在另一个运行级别启动它来修复它。
如果你实现了正确的标题,你可以使用init和systemd(Fedora)
答案 4 :(得分:0)
您应该将以下代码添加到脚本/etc/inti.d/redis_6379
中。 status
参数由命令service --status-all
使用。
# processname: redis_6379
# Source function library.
. /etc/init.d/functions
...
case "$1" in
status)
status -p $PIDFILE redis
script_result=$?
;;
答案 5 :(得分:0)
init.d的日期已经编号了,wtf你还在读这个吗?不再有sudo service
,所有新生孩子都在打倒syscrtl
现在当然在我工作的ubuntu 17.04服务器上,/etc/rc.local
甚至不存在
写一个新的!
rc.local
非常棒,特别是与unix风格daemonize program结合使用......仅这两个,我几乎可以称之为一天。
但是,如果你想将rc.local
提升到一个新的水平,我将介绍我自己的个人redis init.d脚本背后的基本想法 - 我们在整个公司的生产服务器上使用的那个:
抢占有关系统套接字/文件限制的redis投诉
在一些linux中打了一针,并以持久的方式搞乱了sysconf
自动驾驶仪redis,而我小睡一下
#!/bin/sh
### BEGIN INIT INFO
# Provides: redis
# Required-Start: $syslog
# Required-Stop: $syslog
# Should-Start: $all
# Should-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: start and stop redis
# Description: persistent key-value db
### END INIT INFO
NAME=redis
PATH=/opt/bin:/opt/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
EXEC=/opt/sbin/redis-server
CLIEXEC=/opt/sbin/redis-cli
CONF=/etc/$NAME/$NAME.conf
PIDFILE=/var/run/$NAME.pid
SOCKET=/var/run/$NAME.sock
PERF=/tmp/redis.sysctl
KERNELPG=/sys/kernel/mm/transparent_hugepage/enabled
[ -x /opt/sbin/redis-server ] || exit 0
set -e
# tune system for better redis performance
if [ ! -f $PERF ]; then
echo "tunning redis..." &>> $PERF
echo never > $KERNELPG && cat $KERNELPG &>> $PERF
sysctl -w net.core.somaxconn=65535 &>> $PERF
sysctl -w vm.overcommit_memory=1 &>> $PERF
echo "tuned." &>> $PERF && cat $PERF
fi
接下来,如果我们做得对:
让我们有一个很好的惯用案例$ money number,专注于启动和停止而不通过过多的PID追踪诡计进行排序
利用start-stop-daemon(即如果没有父进程,就不会被父进程死亡缩短)
case $1 in
start)
if [ ! -f $PIDFILE ]; then
echo -n "Starting $NAME: "
start-stop-daemon --start --pidfile $PIDFILE --exec $EXEC -- $CONF
echo "waiting for redis db to start..."
while [ ! -f $PIDFILE ]; do
sleep 0.1;
done
fi
PID=$(cat $PIDFILE)
echo "running with pid: $PID"
;;
stop)
if [ ! -f $PIDFILE ]; then
echo "redis is already stopped"
else
PID=$(cat $PIDFILE)
echo -n "Stopping $NAME: "
$CLIEXEC -s $SOCKET shutdown
echo "waiting for shutdown..."
while [ -x /proc/${PID} ]; do
sleep 0.1
done
echo "db stopped."
fi
;;
status)
if [ -f $PIDFILE ]; then
PID=$(cat $PIDFILE)
echo "running with pid: $PID"
else
echo "stopped."
fi
;;
restart|force-reload)
$0 stop && $0 start
;;
*)
echo "Argument \"$1\" not implemented."
exit 2
;;
esac
exit 0
redis.conf
以指定daemonize yes
。使redis成为管理PID文件状态的主要责任方(如果你想知道为什么我们不必在脚本中对它做任何事情,除非从它那里读取它)mkdir /etc/redis
echo 'daemonize yes' >> /etc/redis/redis.conf
echo 'pidfile /var/run/redis.pid' >> /etc/redis/redis.conf
mkdir /etc/redis
vim /etc/redis/redis # keep it traditional, no .sh extensions here
# saving buffers from root all damn day...
chmod a+x /etc/init.d/redis
update-rc.d redis defaults
conf
和install
以适合您。大多数人可能想要删除侦听文件路径,而不是为客户端打开redis端口号的TCP堆栈,