linux 设置开机启动项两种方式

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

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

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

Linux的启动流程

Linux启动顺序

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

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

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

init进程逐一加载开机启动程序,其实就是运行指定目录里的启动脚本。
在运行完指定目录里面的程序后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。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注