zoukankan      html  css  js  c++  java
  • 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),如果程序不在了就重新启动一次。

  • 相关阅读:
    Java equals和==的理解
    String StringBuffer StringBuilder 之间的区别
    HTTP 协议的基本知识,包括请求流程、请求方法等
    原生 XMLHttpRequest
    Java WebSocket实现简易聊天室
    Java Timer和TimerTask
    培训日报3.14(mysql,guava,穿山甲等)
    android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码
    洛谷 P3177 [HAOI2015]树上染色
    洛谷 P2680 运输计划(NOIP2015提高组)(BZOJ4326)
  • 原文地址:https://www.cnblogs.com/wangxin37/p/6397866.html
Copyright © 2011-2022 走看看