Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何让这个init.d脚本在服务器重启时启动?_Linux_Bash_Shell_Redis_Centos - Fatal编程技术网

Linux 如何让这个init.d脚本在服务器重启时启动?

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

我遵循在生产机器上安装Redis的说明(CentOS使用chkconfig)

我看到的示例脚本需要参数
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脚本背后的基本思想——我们在公司的生产服务器上使用的相同脚本:

  • pre-Empty redis对系统套接字/文件限制的投诉

  • 在一些linux性能中使用slap,并以持久的方式使用sysconf

  • 自动驾驶仪在我小睡的时候显示

  • #/垃圾箱/垃圾箱
    ###开始初始化信息
    #提供: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
    
    接下来,如果我们做对了:

  • 让我们来看一个很好的惯用case$money数字,重点放在启动和停止上,而不必通过过多的PID跟踪恶作剧进行排序

  • 利用启动-停止守护进程(即,如果没有父进程,则不能被父进程死亡打断)

  • 案例中的$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
    
  • 复制和设置执行位后按名称更新rc条目:
  • 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=$?
            ;;