簡體   English   中英

如何讓這個init.d腳本在服務器重啟時啟動?

[英]How to get this init.d script to start at server restart?

我正在按照在生產機器上安裝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

確保通過chkconfig添加腳本以進行服務管理。 使用chkconfig --list查看列表並使用chkconfig --add scriptname如果它不存在)。 之后配置您希望它被調用的運行級別。 我猜它是3,4和5所以: chkconfig --level 345 scriptname on

您應該告訴我們您是如何從init.d運行腳本的

但這是一個骯臟的解決方法:

改變線

start)

start|'')

如果沒有傳遞參數,這將啟動它。

如果你想通過命令行啟動服務,你也可以添加/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

...

case "$1" in
    status)
        status -p $PIDFILE redis
        script_result=$?
        ;;

init.d的日期已經編號了,wtf你還在讀這個嗎? 沒有更多的sudo service ,所有新的孩子都在syscrtl

現在當然在我工作的ubuntu 17.04服務器上,/ /etc/rc.local甚至不存在

寫一個新的!

rc.local真棒,特別是與unix風格的daemonize程序相結合......那兩個人,我幾乎可以稱它為一天。

但是,如果你想將rc.local提升到一個新的水平,我將介紹我自己的個人redis init.d腳本背后的基本思想 - 我們在整個公司的生產服務器上使用的那個:

  1. 搶占有關系統套接字/文件限制的redis投訴

  2. 在一些linux中打了一針,並以持久的方式搞亂了sysconf

  3. 當我去睡午覺時,自動駕駛儀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

接下來,如果我們做得對:

  1. 讓我們有一個很好的慣用案例$ money number,專注於啟動和停止而不通過過多的PID跟蹤惡作劇進行排序

  2. 利用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
  1. 編輯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
  1. 復制並設置執行位后,按名稱更新rc條目:
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. 這是完整的示例鏈接 w / service installer。 同樣,請務必編輯confinstall以適合您。 大多數人可能想要刪除偵聽文件路徑,而不是為客戶端打開redis端口號的TCP堆棧,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM