• 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
     
  • 相关阅读:
    时间序列深度学习:seq2seq 模型预测太阳黑子
    时间序列分析工具箱——sweep
    WebApi 找到了与该请求匹配的多个操作
    EF(EntityFramework)与mysql使用,错误终极解决方案
    EF(EntityFramework) 插入或更新数据报错
    EF(EntityFramework)与mysql使用,取数据报错,linq实体映射错误
    EF(EntityFramework)与mysql使用,序列化问题[System.ObjectDisposedException]
    EF(EntityFramework)与mysql使用,乱码问题
    c# AutoMapper 使用方式
    c# json 序列化时遇到错误 error Self referencing loop detected for type
  • 原文地址:https://www.cnblogs.com/firstForEver/p/5272599.html
Copyright © 2020-2023  润新知