Linux 如何让这个init.d脚本在服务器重启时启动?
我遵循在生产机器上安装Redis的说明(CentOS使用chkconfig) 我看到的示例脚本需要参数Linux 如何让这个init.d脚本在服务器重启时启动?,linux,bash,shell,redis,centos,Linux,Bash,Shell,Redis,Centos,我遵循在生产机器上安装Redis的说明(CentOS使用chkconfig) 我看到的示例脚本需要参数start来实际启动它,而init.d似乎没有这样做(传递参数) 必须运行的真正命令是/etc/init.d/redis_6379 start,但它实际调用的是/etc/inti.d/redis_6379,它只是说使用start或stop作为参数 因此,当我的服务器重新启动时,它实际上不会启动redis。我在这里该怎么办 这是初始配置 #!/bin/sh # # Simple Redis ini
start
来实际启动它,而init.d似乎没有这样做(传递参数)
必须运行的真正命令是/etc/init.d/redis_6379 start
,但它实际调用的是/etc/inti.d/redis_6379
,它只是说使用start或stop作为参数
因此,当我的服务器重新启动时,它实际上不会启动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
您应该告诉我们您是如何从init.d运行脚本的 但这里有一个肮脏的解决办法: 换线
start)
到
如果没有传递任何参数,这将使其启动。确保您的脚本已通过
chkconfig
添加到服务管理中。使用chkconfig--list
查看列表,如果不存在,则使用chkconfig--addscriptname
。之后,配置要调用它的运行级别。我猜是3点,4和5所以:chkconfig--
上的级别345 scriptname如果您想通过命令行启动服务,您也可以添加/etc/rc.d/rc.local
,而不是在init.d中创建服务文件。Centos redis有一个带有chkconfig头行的init脚本,声明它将在所有运行级别启动,这是非常糟糕的。chkconfig用于管理/etc/rc.d中的符号链接
# chkconfig: - 85 15
我建议redis是一种在关键服务启动后在3级运行的服务(例如sshd)。在测试场景中,在投入生产之前重新启动服务器。如果redis无法启动(就发生在这里),您就无法在另一个运行级别启动它来修复它
如果您实现了正确的头文件,您可以使用init和systemd(Fedora)您应该在脚本
/etc/inti.d/redis_6379
中添加下面的代码。status
参数由命令service--status all
使用
# processname: redis_6379
# Source function library.
. /etc/init.d/functions
Init.d的日子不多了,你还在读这篇文章吗?不再有
sudo服务了
,所有新来的孩子都在用syscrtl
现在,就像我工作时的ubuntu 17.04服务器一样,/etc/rc.local
甚至不存在
写一个新的
rc.local
非常棒,尤其是与unix风格相结合。。。就这两个人而言,我几乎可以算是一天了
但是,如果您想将rc.local
提升到一个新的层次,我将介绍我个人redis init.d脚本背后的基本思想——我们在公司的生产服务器上使用的相同脚本:
#/垃圾箱/垃圾箱
###开始初始化信息
#提供:redis
#必需的开始:$syslog
#所需停止:$syslog
#应该开始:$all
#应该停止:$all
#默认开始:2 3 4 5
#默认停止:0 1 6
#X-Interactive:真的吗
#简短描述:启动和停止redis
#Description:持久键值db
###结束初始化信息
NAME=redis
路径=/opt/bin:/opt/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
EXEC=/opt/sbin/redis服务器
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\u hugepage/enabled
[-x/opt/sbin/redis服务器]| |退出0
set-e
#调整系统以获得更好的redis性能
如果[!-f$PERF];然后
回显“tunning redis…”和>>$PERF
echo never>$KERNELPG&&cat$KERNELPG&>$PERF
sysctl-w net.core.somaxconn=65535&>>$PERF
sysctl-w vm.overmit_memory=1&>>PERF
回显“已调谐”。&>>$PERF&&cat$PERF
fi
接下来,如果我们做对了:
案例中的$1
开始)
如果[!-f$PIDFILE];然后
echo-n“起始$NAME:”
start-stop守护进程--start--pidfile$pidfile--exec$exec--$CONF
echo“等待redis db启动…”
而[!-f$PIDFILE];做
睡眠0.1;
完成
fi
PID=$(cat$PIDFILE)
echo“使用pid运行:$pid”
;;
(停止)
如果[!-f$PIDFILE];然后
echo“redis已停止”
其他的
PID=$(cat$PIDFILE)
echo-n“正在停止$NAME:”
$CLIEXEC-s$套接字关闭
echo“等待关机…”
而[-x/proc/${PID}];做
睡眠0.1
完成
回声“db停止”
fi
;;
(状态)
如果[-f$PIDFILE];然后
PID=$(cat$PIDFILE)
echo“使用pid运行:$pid”
其他的
回声“停止”
fi
;;
重新启动(强制重新加载)
$0停止和$0开始
;;
*)
未实现回显“参数\”“1\”
出口2
;;
以撒
出口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#保持传统,这里没有.sh扩展
#整天都在从根目录保存缓冲区。。。
chmod a+x/etc/init.d/redis
更新rc.d redis默认值
<
# processname: redis_6379
# Source function library.
. /etc/init.d/functions
case "$1" in
status)
status -p $PIDFILE redis
script_result=$?
;;