Linux开机启动程序详解

init进程

init进程是非内核进程中第一个被启动运行的,因此它的进程编号PID的值总是1。init读它的配置文件/etc/inittab,决定需要启动的运行级别(Runlevel)。从根本上说,运行级别规定了整个系统的行为,每个级别(分别由0到6的整数表示)满足特定的目的。如果定义了initdefault级别,这个值就直接被选中,否则需要由用户输入一个代表运行级别的数值。
输入代表运行级别的数字之后,init根据/etc/inittab文件中的定义执行一个命令脚本程序。缺省的运行级别取决于安装阶段对登录程序的选择:是使用基于文本的,还是使用基于X-Window的登录程序。
rc命令脚本程序我们已经知道,当运行级别发生改变时,将由/etc/inittab文件定义需要运行哪一个命令脚本程序。这些命令脚本程序负责启动或者停止该运行级别特定的各种服务。由于需要管理的服务数量很多,因此需要使用rc命令脚本程序。其中,最主要的一个是/etc/rc.d/rc,它负责为每一个运行级别按照正确的顺序调用相应的命令脚本程序。我们可以想象,这样一个命令脚本程序很容易变得难以控制!为了防止这类事件的发生,需要使用精心设计的方案。

对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是rcX.d,其中的X就是代表运行级别的数字。比如说,运行级别3的全部命令脚本程序都保存在/etc/rc.d/rc3.d子目录中。在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接,但是,这些符号链接并不使用命令脚本程序在/etc/rc.d/init.d子目录中原来的名字。如果命令脚本程序是用来启动一个服务的,其符号链接的名字就以字母S打头;如果命令脚本程序是用来关闭一个服务的,其符号链接的名字就以字母K打头。
许多情况下,这些命令脚本程序的执行顺序都很重要。如果没有先配置网络接口,就没有办法使用DNS服务解析主机名!为了安排它们的执行顺序,在字母S或者K的后面紧跟着一个两位数字,数值小的在数值大的前面执行。比如:/etc/rc.d/rc3.d/S50inet就会在/etc/rc.d/rc3.d/S55named之前执行(S50inet配置网络设置,55named启动DNS服务器)。存放在/etc/rc.d/init.d子目录中的、被符号链接上的命令脚本程序是真正的实干家,是它们完成了启动或者停止各种服务的操作过程。当/etc/rc.d/rc运行通过每个特定的运行级别子目录的时候,它会根据数字的顺序依次调用各个命令脚本程序执行。它先运行以字母K打头的命令脚本程序,然后再运行以字母S打头的命令脚本程序。对以字母K打头的命令脚本程序来说,会传递Stop参数;类似地对以字母S打头的命令脚本程序来说,会传递Start参数。编写自己的rc命令脚本在维护Linux系统运转的日子里,肯定会遇到需要系统管理员对开机或者关机命令脚
本进行修改的情况。

一、/etc/rc.d/rc.local

这是一个最简单的方法,编辑“/etc/rc.d/rc.local(链接地址为/etc/rc.local)”,把启动程序的shell命令输入进去即可,输入命令的全路径,类似于windows下的“启动”。

#在centos7中,/etc/rc.d/rc.local文件的权限被降低了,开机的时候执行自己的脚本是不能起动一些服务的,执行下面的命令可以将文件标记为可执行的文件
chmod +x /etc/rc.d/rc.local

vim /etc/rc.d/rc.local

# 文件最后添加可执行脚本
/data/run/script/start-service.sh

#在脚本中输入启动服务的命令,如开机启动tomcat
#!/bin/bash
export JDK_HOME=/home/java/jdk1.8.0_91
export JAVA_HOME=/home/java/jdk1.8.0_91
/home/tomcat/apache-tomcat-8.0.36/bin/startup.sh

#赋予执行权限
chmod +x /data/run/script/start-service.sh

这样,start-service.sh脚本在开机的时候就会被执行了,以后自启动服务可以直接添加在该脚本中。

二、chkconfig

# 查看nginx服务启动选项的配置状态
chkconfig --list | grep nginx

# 0 - 停机
# 1 - 单用户模式 
# 2 - 多用户,没有NFS 
# 3 - 完全多用户模式(标准的运行级,命令行模式启动) 
# 4 - 没有用到 
# 5 - X11(xwindow,图形界面启动) 
# 6 - 重新启动 
# 运行级别最常用的设置为2,3,5
nginx   0:off	1:off	2:on	3:on	4:on	5:on	6:off

#添加系统服务
chkconfig --add nginx

#删除系统服务
chkconfig --del nginx

#让mysql服务在命令行模式,随系统启动
chkconfig --level 3 mysql on

#取消mysql service在runlevel3的自动启动设置
chkconfig --level 5 mysql off

#查看哪些程序被添加为自启动,即查看这个文件中添加了哪些程序路径
cat /etc/rc.local

三、crontab

通过crontab可以设定程序的执行时间表,例如让程序在每天的8点,或者每个星期一的10点执行一次。
crontab -l 列出时间表;
crontab -e编辑时间表;
crontab -d删除时间表;

“-l”就是一个查看而已;
“-e”是编辑,和vi没什么差别(其实就是用vi编辑一个特定文件);
“-d”基本不用,因为它把该用户所有的时间表都删除了,一般都是用“-e”编辑把不要了的时间表逐行删除;

那到底该如何编辑呢?

crontab文件的格式是:M H D m d CMD。
一个6个字段,其中最后一个CMD就是所要执行的程序,如haha.sh。
M:分钟(0-59)
H:小时(0-23)
D:日期(1-31)
m:月份(1-12)
d:一个星期中的某天(0-6,0代表周日)

这5个时间字段用空格隔开,其值可以是一个数字,也可以用逗号隔开的多个数字(或其他) ,如果不需设置,则默认为“*”。

例如,每天的8点5分执行haha.sh,就是“5 8 * * * /opt/./haha.sh”。

好像和“开机程序自动启动”扯远了,现在回归正题。
其实上面介绍的crontab的功能已经具备了开机自动启动的能力,可以写一个监测脚本,每5分钟执行一次(*/5 * * * * ./haha.sh),如果程序不在了就重新启动一次。

posted @ 2017-02-14 15:33  星空str  阅读(1256)  评论(0编辑  收藏  举报