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
复制代码

 

 mysql的相关启动服务编写:https://blog.51cto.com/oldboy/2124950

 

posted @ 2019-03-08 15:41  AppleLife  阅读(959)  评论(0编辑  收藏  举报