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

有时候我们需要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。

linux 设置开机启动项两种方式的更多相关文章

  1. Linux设置开机启动项

    第一种方式:ln -s 建立启动软连接 在Linux中有7种运行级别(可在/etc/inittab文件设置),每种运行级别分别对应着/etc/rc.d/rc[0~6].d这7个目录 Tips:/etc ...

  2. Linux 设置开机启动项的几种方法

    方法一:编辑rc.loacl脚本 Ubuntu开机之后会执行/etc/rc.local文件中的脚本. 所以我们可以直接在/etc/rc.local中添加启动脚本. $ vim /etc/rc.loca ...

  3. Linux 添加开机启动项的三种方法

    linux 添加开机启动项的三种方法. (1)编辑文件 /etc/rc.local 输入命令:vim /etc/rc.local 将出现类似如下的文本片段: #!/bin/sh## This scri ...

  4. 原创:四种Linux系统开机启动项优命令超给力超详细详解

    老葵花哥哥又开课了 接下来是你们的齐天大圣孙悟空给你们带来的详细版Linux系统开机启动优化四种命令 第一种方法是很正常的 第二种有点难理解 第三种来自我的一个奇思妙想 本文档秉承 不要钱也不要臀部的 ...

  5. 源码编译安装nginx及设置开机启动项

    1.上传nginx文档:解压到/data目录下,并安装依赖包tar xf nginx-1.20.1.tar.gz -C /data/cd /data/nginx-1.20.1/ && ...

  6. HTML中设置背景图的两种方式

    HTML中设置背景图的两种方式 1.background    background:url(images/search.png) no-repeat top; 2.background-image ...

  7. linux添加开机启动项、登陆启动项、定时启动项、关机执行项等的方法

    使用chkconfig命令可以查看在不同启动级别下课自动启动的服务(或是程序),命令格式如下: chkconfig --list 可能输出如下: network         0:off   1:o ...

  8. Android系统移植与调试之------->如何修改开机动画的两种方式剖析

    首先,我们先来分析一下源码: frameworks/base/cmds/bootanimation/BootAnimation.cpp 首先看一下定义的常量: BootAnimation::ready ...

  9. Linux->ZooKeeper开机启动的俩种方式

    两种方式可以实现开机自启动 第一种:直接修改/etc/rc.d/rc.local文件 在/etc/rc.d/rc.local文件中需要输入两行, 其中export JAVA_HOME=/usr/jav ...

随机推荐

  1. CF#508 1038E Maximum Matching

    ---题面--- 题解: 感觉还是比较妙的,复杂度看上去很高(其实也很高),但是因为n只有100,所以还是可以过的. 考虑一个很暴力的状态f[i][j][x][y]表示考虑取区间i ~ j的方格,左右 ...

  2. HDU3480:Division——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=3480 将一列数划分成几个集合,这些集合的并集为该数列,求每个数列的(最大值-最小值)^2的和的最小值. 简单的d ...

  3. BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2838  Solved: 1663 [Submit][St ...

  4. AOJ.176 两数组最短距离 (乱搞题)

    两数组最短距离 点我挑战题目 题意分析 给出2个数组,让求出2个数组元素差的绝对值的最小值是多少. 我这里是o(m+n)的算法.首先对于第一个数组,让他的第一个元素和第二个元素比较,如果他的第一个元素 ...

  5. 项目管理---git----快速使用git笔记(四)------远程项目代码的首次获取

    使用git最常见的场景是 你需要参与到一个项目中,而这个项目的代码,同事已经上传到github或者https://coding.net了. 这时候他会给你一个项目代码的远程仓库链接. 例如: http ...

  6. React ref的用法

    React的ref有3种用法: 1. 字符串(已废弃)2. 回调函数3. React.createRef() (React16.3提供) 1. 字符串 最早的ref用法. 1.dom节点上使用,通过t ...

  7. hibernate 如何配置两个属性唯一

    在单一字段的唯一性约束时,我们可以在映射文件里配置property属性的unique="true"来达到目的,但多字段的唯一性约束怎样处理呢?如 果使用复合主键可以很简单地解决这个 ...

  8. 【PHP】Windows下配置用mail()发送邮件

    ZZ:解决windows系统下php.ini邮件配置正确不发送邮件的问题 php mail()函数在windows不能用,需要安装sendmail,假如是用的XAMPP,则已经下载好,不需要重新下载~ ...

  9. Item 29 优先考虑类型安全的异构容器

    集合API展示了泛型的一般用法.但是它们(Set,HashMap,Map)限制了每个容器只能有固定数目的类型参数.     比如Set集合,HashMap集合: import java.util.Ha ...

  10. sscanf的用法

    sscanf也太好用了8我竟然一直都不知道qaq #include<cstdio> #include<cstdlib> #include<cstring> #inc ...