Debian的服務腳本簡析

#Debian服務腳本 這裏一redis爲例,腳本文件位於/etc/init.d/redis-server:ios

<!-- lang: shell -->
#! /bin/sh
### BEGIN INIT INFO
# Provides:		redis-server
# Required-Start:	$syslog $remote_fs
# Required-Stop:	$syslog $remote_fs
# Should-Start:		$local_fs
# Should-Stop:		$local_fs
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	redis-server - Persistent key-value db
# Description:		redis-server - Persistent key-value db
### END INIT INFO


PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/redis-server
DAEMON_ARGS=/etc/redis/redis.conf
NAME=redis-server
DESC=redis-server

RUNDIR=/var/run/redis
PIDFILE=$RUNDIR/redis-server.pid                                                                                                                                                                                                              

test -x $DAEMON || exit 0

if [ -r /etc/default/$NAME ]
then
    . /etc/default/$NAME
fi

. /lib/lsb/init-functions

set -e

case "$1" in
  start)
    echo -n "Starting $DESC: "
    mkdir -p $RUNDIR
    touch $PIDFILE
    chown redis:redis $RUNDIR $PIDFILE
    chmod 755 $RUNDIR

    if [ -n "$ULIMIT" ]
    then
        ulimit -n $ULIMIT
    fi

    if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS
    then
        echo "$NAME."
    else
        echo "failed"
    fi
    ;;
  stop)
    echo -n "Stopping $DESC: "
    if start-stop-daemon --stop --retry forever/TERM/1 --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON
    then
        echo "$NAME."
    else
        echo "failed"
    fi
    rm -f $PIDFILE
    sleep 1
    ;;

  restart|force-reload)
    ${0} stop
    ${0} start
    ;;

  status)
    echo -n "$DESC is "
    if start-stop-daemon --stop --quiet --signal 0 --name ${NAME} --pidfile ${PIDFILE}
    then
        echo "running"
    else
        echo "not running"
        exit 1
    fi
    ;;

  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}" >&2
    exit 1
    ;;
esac

exit 0

其實就是一個特殊的bash腳本,主要是經過start-stop-daemon來管理進程的,start-stop-daemon的manpage描述以下:redis

start-stop-daemon is used to control the creation and termination of system-level processes. Using one of the matching options, start-stop-daemon can be configured to find existing instances of a running process.
Note: unless --pidfile is specified, start-stop-daemon behaves similar to killall(1). start-stop-daemon will scan the process table looking for any processes which matchthe process name, uid, and/or gid (if specified). Any matching process will prevent --start from starting the daemon. All matching processes will be sent the TERM signal (or the one specified via --signal or --retry) if --stop is specified. For daemons which have long-lived children which need to live through a --stop, you must specify a pid‐file.shell

簡單的說服務經過start-stop-daemon啓動能夠更便於系統管理。bash

  • 腳本分析less

  • 首先開頭:### BEGIN INIT INFO ### END INIT INFO之間的東西是必須的。這段內容描述了服務的一些信息。ide

  • 而後是變量聲明:並非強制的,只是規範,通常會聲明服務的可執行文件,PID文件所在的位置等信息。函數

  • /etc/default/*.conf 加載默認配置 /etc/init.d/fuctions(Debian爲/lib/lsb/init-fuctions) 爲/etc/init.d中的腳本提供一些變量定義和實用函數,詳細的能夠參考fuctions.測試

  • 正文,定義start/stop/status/restart的行爲,通常照着上面的例子就能夠了,此外還能夠參考start-stop-daemon的man page。ui

  • 服務管理:sysinitv本質上是BSD風格的init+shell。因此每一個發行版採用了不一樣的機制去管理系統服務,其實本質上是將腳本根據運行級別分別鏈接到軟鏈接到/etc/rc.X/下。在Debian下使用的是update-rc.d命令。將上述腳本命名爲redis,放到/etc/init.d/下。rest

  1. 刪除一個服務 update-rc.d -f redis remove 參數-f是強制刪除符號連接,即便/etc/init.d/redis仍然存在。 Note:這個命令僅僅禁止該服務,直到該服務被升級。若是你想在服務升級後仍然保持被禁用。應該執行以下的命令: update-rc.d redis stop 80 0 1 2 3 4 5 6 .

二、增長一個服務

若是你想從新添加這個服務並讓它開機自動執行,你須要執行如下命令: update-rc.d redis defaults 而且能夠指定該服務的啓動順序: update-rc.d redis defaults 90 還能夠更詳細的控制start與kill順序: update-rc.d redis defaults 20 80 其中前面的20是start時的運行順序級別,80爲kill時的級別。也能夠寫成: update-rc.d redis start 20 2 3 4 5 . stop 80 0 1 6 . 其中0~6爲運行級別。 update-rc.d命令不只適用Linux服務,編寫的腳本一樣能夠用這個命令設爲開機自動運行

附錄:start-stop-daemon經常使用選項:

主要參數 Commands: -S|--start -- <argument> ... 開啓一個系統守護程序,並傳遞參數給它 -K|--stop 中止一個程序 -T|--status 獲得程序的狀態 -H|--help 顯示幫助信息 -V|--version 打印版本信息 Matching options (at least one is required): -p|--pidfile <pid-file> pid file to check -x|--exec <executable> program to start/check if it is running -n|--name <process-name> process name to check -u|--user <username|uid> process owner to check Options: -g|--group <group|gid> 按指定用戶組權限運行程序 -c|--chuid <name|uid[:group|gid]> 按指定用戶、用戶組權限運行程序 -s|--signal <signal> signal to send (default TERM) -a|--startas <pathname> program to start (default is <executable>) -r|--chroot <directory> chroot to <directory> before starting -d|--chdir <directory> change to <directory> (default is /) -N|--nicelevel <incr> add incr to the process' nice level -P|--procsched <policy[:prio]> use <policy> with <prio> for the kernel process scheduler (default prio is 0) -I|--iosched <class[:prio]> use <class> with <prio> to set the IO scheduler (default prio is 4) -k|--umask <mask> 在開始運行前設置<mask> -b|--background 後臺運行 -m|--make-pidfile 當命令自己不建立pidfile時,由start-stop-daemon建立 -R|--retry <schedule> 等待timeout的時間,檢查進程是否中止,若是沒有發送KILL信號; -t|--test 測試模式 -o|--oknodo exit status 0 (not 1) if nothing done -q|--quiet 不要輸出警告 -v|--verbose 顯示運行過程信息

相關文章
相關標籤/搜索