linux下service+命令和直接去執行命令的區別,怎么自己建立一個service啟動


  啟動一些程序服務的時候,有時候直接去程序的bin目錄下去執行命令,有時候利用service啟動。

  比如啟動mysql服務時,大部分喜歡執行service mysqld start。當然也可以去mysql下執行bin命令帶上幾個參數什么的。

  那么service是啥呢?linux可以man一下,看出來就是去/etc/init.d下執行了可執行的shell腳本。

   service執行的服務腳本都是在/etc/init.d目錄下,各個程序下腳本里執行的命令仍然是在各個bin下。

這樣我們也可以在這個目錄下寫一個shell,模仿這些程序來個。

先寫一個簡單到爆炸的service啟動腳本。  

# cd /etc/init.d

# vi haha     #這個腳本名字叫haha

#!/bin/sh

echo '$0='$0     '$1='$1  


start(){
  echo 'ls'
  cd ~ && ls 
}

stop(){
  echo 'll'
  cd ~ && ls -l
}


case "$1" in 

"start")
   start   
;;

"stop")
   stop
;;

esac

 

給這個腳本的執行權限比如 # chmod +x haha

執行這個:

# service haha start 

# service haha stop

可以看到腳本里輸出了一下$0,$1

$0=/etc/init.d/haha

$1=start 或者 stop,就是haha腳本的參數

然后start和stop執行了非常簡單的命令~

例子就是這樣,其他的腳本無非就是去執行了它自己命令包的命令

 

有時間可以分析下php-fpm的service命令方式的腳本:

#! /bin/sh
#
# chkconfig: - 84 16
# description:    PHP FastCGI Process Manager
# processname: php-fpm
# config: /etc/php-fpm.conf
# config: /etc/sysconfig/php-fpm
# pidfile: /var/run/php-fpm/php-fpm.pid
#
### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: start and stop PHP FPM
# Description: PHP FastCGI Process Manager
### END INIT INFO

# Standard LSB functions
#. /lib/lsb/init-functions

# Source function library.
. /etc/init.d/functions      #圓點.表示引入這個文件。 加載函數庫文件,比如下面的daemon,killproc,status都是這個文件里的

# Check that networking is up.
. /etc/sysconfig/network     #加載網卡情況文件, 比如下面的"$NETWORKING" = "no"

# Additional environment file
if [ -f /etc/sysconfig/php-fpm ]; then    #加載這個文件,是否有額外的配置信息
      . /etc/sysconfig/php-fpm
fi

if [ "$NETWORKING" = "no" ]
then
    exit 0
fi

RETVAL=0    #返回值 初始化
prog="php-fpm"  #程序名稱
pidfile=${PIDFILE-/var/run/php-fpm/php-fpm.pid}  # $(a-b)這種表達方式表示,如果a存在,那么就返回$a,否則就返回$b。PIDFILE就表示可能是上面加載文件/etc/sysconfig/php-fpm里的變量。   -- pidfile,存放一個進程號pid
lockfile=${LOCKFILE-/var/lock/subsys/php-fpm}   

start () {
    echo -n $"Starting $prog: "  # echo -n  -n表示不換行
    dir=$(dirname ${pidfile})
    [ -d $dir ] || mkdir $dir    # 不存在pid文件的目錄則創建
    daemon --pidfile ${pidfile} /usr/sbin/php-fpm --daemonize     #執行php-fpm命令,這個最重要的
    RETVAL=$?   #獲取上一條命令的執行返回值
    echo   #表示換行
    [ $RETVAL -eq 0 ] && touch ${lockfile}   # 如果啟動成功,生成一個lockfile文件
}
stop () {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} php-fpm    # 停掉程序 killproc的函數就在文件頭處引入的/etc/init.d/functions文件
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ] ; then
        rm -f ${lockfile} ${pidfile}
    fi
}

restart () {
        stop
        start
}

reload () {
    echo -n $"Reloading $prog: "
    if ! /usr/sbin/php-fpm --test ; then
            RETVAL=6
            echo $"not reloading due to configuration syntax error"
            failure $"not reloading $prog due to configuration syntax error"
    else
        killproc -p ${pidfile} php-fpm -USR2    # 這里關鍵的是信號USR2,這個信號告訴是平滑重載所有worker進程並重新載入配置和二進制模塊;這就是reload和restart的區別
        RETVAL=$?
    fi
    echo
}


# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status -p ${pidfile} php-fpm
    RETVAL=$?
    ;;
  restart)
    restart
    ;;
  reload|force-reload)
    reload
    ;;
  configtest)
     /usr/sbin/php-fpm --test
    RETVAL=$?
    ;;
  condrestart|try-restart)
    [ -f ${lockfile} ] && restart || :
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart|configtest}"
    RETVAL=2
        ;;
esac

exit $RETVAL

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM