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

时间:2013-09-08 05:28:07

标签: linux bash shell redis centos

我正在按照在生产计算机上安装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

6 个答案:

答案 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脚本背后的基本想法 - 我们在整个公司的生产服务器上使用的那个:

  1. 抢占有关系统套接字/文件限制的redis投诉

  2. 在一些linux中打了一针,并以持久的方式搞乱了sysconf

  3. 自动驾驶仪redis,而我小睡一下

  4. #!/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
    

    接下来,如果我们做得对:

    1. 让我们有一个很好的惯用案例$ money number,专注于启动和停止而不通过过多的PID追踪诡计进行排序

    2. 利用start-stop-daemon(即如果没有父进程,就不会被父进程死亡缩短)

    3. 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
      
      1. 修改redis.conf以指定daemonize yes。使redis成为管理PID文件状态的主要责任方(如果你想知道为什么我们不必在脚本中对它做任何事情,除非从它那里读取它)
      2. mkdir /etc/redis
        echo 'daemonize yes' >> /etc/redis/redis.conf
        echo 'pidfile /var/run/redis.pid' >> /etc/redis/redis.conf
        
        1. 复制并设置执行位后,按名称更新您的rc条目:
        2. 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
          
          1. 这是full example link w / service安装程序。同样,请务必修改confinstall以适合您。大多数人可能想要删除侦听文件路径,而不是为客户端打开redis端口号的TCP堆栈,