zoukankan      html  css  js  c++  java
  • linux 设置开机启动项两种方式

    原文链接:http://blog.csdn.net/karchar/article/details/52489572

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务。

    在解问题之前先来看看Linux的启动流程

    Linux的启动流程

    Linux启动顺序

    主要顺序就是: 
    1. 加载内核 
    2. 启动初始化进程 
    3. 确定运行级别 
    4. 加载开机启动程序 
    5. 用户登录

    启动流程的具体细节可以看看Linux 的启动流程 

    第4步加载启动程序其实是两步:

    1. init进程逐一加载开机启动程序,其实就是运行指定目录里的启动脚本。
    2. 在运行完指定目录里面的程序后init进程还会去执行/etc/rc.local 这个脚本。

    ps:“指定目录”是指在第3步中设置的运行级别对应的目录。

    要完成我们的需求,我们使用第4步中的任意一种方式都可以。

    下面分别就是这两种方式的具体实现:

    1.chkconfig

    supervisord服务脚本为例:

    #!/bin/sh
    ##
    ## /etc/rc.d/init.d/supervisord
    ##
    #supervisor is a client/server system that
    # allows its users to monitor and control a
    # number of processes on UNIX-like operating
    # systems.
    #
    # chkconfig: - 64 36
    # description: Supervisor Server
    # processname: supervisord
    
    # Source init functions
    . /etc/rc.d/init.d/functions
    
    prog="supervisord"
    prefix="/usr/"
    exec_prefix="${prefix}"
    PIDFILE="/var/run/supervisord.pid"
    CONFIG="/etc/supervisord.conf"
    prog_bin="${exec_prefix}bin/supervisord -c $CONFIG "
    
    function log_success_msg() {
            echo "$@" "[ OK ]"
    }
    
    function log_failure_msg() {
            echo "$@" "[ OK ]"
    }
    
    start()
    {
           #echo -n $"Starting $prog: "
           #daemon $prog_bin --pidfile $PIDFILE
           #[ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog failed"
           #echo
            if [ ! -r $CONFIG ]; then
                    log_failure_msg "config file doesn't exist (or you don't have permission to view)"
                    exit 4
            fi
    
            if [ -e $PIDFILE ]; then
                    PID="$(pgrep -f $PIDFILE)"
                    if test -n "$PID" && kill -0 "$PID" &>/dev/null; then
                            # If the status is SUCCESS then don't need to start again.
                            log_failure_msg "$NAME process is running"
                            exit 0
                    fi
            fi
    
            log_success_msg "Starting the process" "$prog"
            daemon $prog_bin --pidfile $PIDFILE
            log_success_msg "$prog process was started"
    
    }
    stop()
    {
           echo -n $"Shutting down $prog: "
           [ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"
           echo
    }
    
    case "$1" in
    
     start)
       start
     ;;
    
     stop)
       stop
     ;;
    
     status)
           status $prog
     ;;
    
     restart)
       stop
       start
     ;;
    
     *)
       echo "Usage: $0 {start|stop|restart|status}"
     ;;
    
    esac

    第1步:把上面的脚本放在/etc/init.d/文件夹下。

    ln -s ./supervisord  /etc/init.d/supervisord

    第2步:将启动脚本权限改为可执行。

    chmod a+x /etc/init.d/supervisord

    第3步:添加启动项。

    chkconfig --add supervisord
    chkconfig supervisord on

    第4步:检查是否设置成功。

    chkconfig --list | grep supervisord
    supervisord     0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭

    成功~

    2.修改/etc/rc.local脚本

    /etc/rc.local 脚本内容如下

    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.
    
    #touch /var/lock/subsys/local
    echo "hello linux" >> /tmp/hello2.log
    
    influxd > /tmp/influxd.log 2>&1 &
    
    echo "hello linux" >> /tmp/hello3.log

    echo “hello linux” >>/tmp/hello2.log ,就模拟了一个简单的开机启动脚本。

    influxd 则就是启动 influxd 服务。

    ps: influxd > /tmp/influxd.log 2>&1 & 这样写的意思是让influxd后台执行。

    influxd和前面的echo "hello linux"是不一样的,echo 执行过后就结束了,而influxd则为服务一直执行,如果不后台执行的话则influxd 启动后就不会返回,那么init进程就会一直等待influxd执行完毕,导致后面的程序一直无法执行。

    这个着实坑了我一把,当时我写的是:

    #!/usr/bin/python
    ...
    influxd
    telegraf

    发现influxd启动成功了,telegraf就是起不来。后来把telegraf写在前面就能起来,但是influxd又起不来了于是就猜测是这个原因~~~bingo。

  • 相关阅读:
    Fiddler 教程
    Snippet Compiler——代码段编译工具
    HTML5 Audio时代的MIDI音乐文件播放
    sql 数据库 庞大数据量 需要分表
    使用LINQ查询非泛型类型
    找出numpy array数组的最值及其索引
    list的*运算使用过程中遇到的问题
    4.keras实现-->生成式深度学习之用GAN生成图像
    np.repeat 与 np.tile
    pandas中的axis=0,axis=1,傻傻分不清楚
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/8297739.html
Copyright © 2011-2022 走看看