linux系统运行级别改变时,系统所做的工作

# 其实计算机的关闭也就是运行级别的切换;
# init进程监控运行级别是否改变。
# 如果运行级别改变了,init进程就会触发 /etc/rc.d/rc 脚本运行。
# rc 脚本作用是:
#    1、如果当前计算机运行有,在当前运行级别
#   (correctrunlevel )/etc/rc.d/rc$runlevel.d/目录下以K开头的服务。就关闭。
#     2、开启当前运行级别(correct runlevel )/etc/rc.d/rc$runlevel.d/目录下#   以S开头的服务
#这样就实现了,不同运行级别的所允许启动、禁止启动的服务的控制。
#如果当前运行级别(correct runlevel )/etc/rc.d/rc$runlevel.d/目录下以S开头的#服务脚本有:half 就会关闭计算机。
#[[email protected] rc.d]# ll rc0.d/S*
lrwxrwxrwx 1 root root 17 Apr  5 00:13 rc0.d/S00killall ->../init.d/killall
lrwxrwxrwx 1 root root 14 Apr  5 00:13 rc0.d/S01halt -> ../init.d/halt
# 会先执行kill脚本再执行halt脚本。
# 其实系统管理员发出【shutdown】命令,就是通知 init 进程,运行级别改变了。
[[email protected] ~]# man shutdown
.....shutdown does its job by signalling the init process, asking it to change the runlevel.
......
# 进程init的配置文件/etc/inittab 定义等级切换时动作
[[email protected] ~]# vim /etc/inittab
l0:0:wait:/etc/rc.d/rc 0  # 在开机时,或改变运行等级时都会执行
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# 这些行表示在系统的运行级别每次发生变化时都就当运行一次rc程序(/etc/rc.d/rc脚本),
# 而且init应当将一个包含运行级别号(0~~6)的单字符参数传递给rc程序。
# 会监控主机的运行等级的变化,如运行等级变化了就会调用:/etc/rc.d/rc 脚本
# 假如当前主机的运行等级是:
[[email protected] bin]# runlevel
N 3
# 作用命令init 发出关闭程序信号使用: 
[[email protected] bin]# init 0  
# init进程发现运行等级改变就会按照配置文件inittab中的 l0:0:wait:/etc/rc.d/rc # 0执行相关操作。  
[[email protected] ~]# vim /etc/rc.d/rc
#! /bin/bash
#
# rc            This file is responsible for starting/stopping
#               services when the runlevel changes.
#
# Original Author:
#               Miquel van Smoorenburg, <[email protected]>
#
set -m
###################################################################
#该函数是检查当前运行级别的脚本条件:
#                     1、该脚本必须有可运行权限;
#                     2、不属于函数is_ignored_file 中指定的类型
# check a file to be a correct runlevel script
check_runlevel ()
{
        # Check if the file exists at all.
        [ -x "$1" ] || return 1
        is_ignored_file "$1" && return 1 # 调用函数检查文件类型。
        return 0
}
# Now find out what the current and what the previous runlevel are.
argv1="$1"   #记录:运行级别改变时,init进程触发运行rc脚本时传递的参数。
set `/sbin/runlevel`  # 记录当前主机的运行级别
runlevel=$2
previous=$1
export runlevel previous
. /etc/init.d/functions
# See if we want to be in user confirmation mode
if [ "$previous" = "N" ]; then
        if [ -f /var/run/confirm ]; then
                echo $"Entering interactive startup"
        else
                echo $"Entering non-interactive startup"
        fi
fi
# Get first argument. Set new runlevel to this argument.
[ -n "$argv1" ] && runlevel="$argv1" 
  #如果进程init监控到运行级别改变时,触发运行rc脚本时传递了参数,
  #就把该参数当作当前主机的运行级别
# Is there an rc directory for this new runlevel? 
   #判断运行级别在/etc/目录下是否的对应目录,如果没有就直接退出。
   #这也可判断传递的运行参数是否正确
[ -d /etc/rc$runlevel.d ] || exit 0
####################################################################
#给/etc/rc.d/rc$runlevel.d目录下的K开头的脚本传递:stop 以实现关闭该运行级别不
#启动的服务
# First, run the KILL scripts.          
for i in /etc/rc$runlevel.d/K* ; do
        check_runlevel "$i" || continue 
        #调用函数check_runlevel检查脚本,如果去一个服务的启动脚本就往下执行,
        #否则退出当前循环执行下一次循环
########################如果 $i 是一个服务的启动脚本,判断该脚本(以K开头的脚本)#在运行级别切换之前是否已经启动。
#因为通过脚本启动服务后(如:service httpd start 或 httpd start),
#都会在/var/lock/subsys/目录下创建一个以启动脚本命名的文件
#也正是通过判断/var/lock/subsys/目录下有没有该服务脚本对应的文件,
#来确定该服务是否启动的。
        # Check if the subsystem is already up.
        subsys=${i#/etc/rc$runlevel.d/K??}
        [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ]                 || continue
        # Bring the subsystem down. 
        #关闭当前运行级别设置不启动的服务(运行级别切换之前启动的服务,
        #但是该服务在当前运行级别是设置不启动的),
        if LC_ALL=C egrep -q "^..*init.d/functions" $i ; then
                $i stop              
        else
                action $"Stopping $subsys: " $i stop
        fi
done
############### 启动当前运行级别设置启动的服务#####################################################################
# Now run the START scripts.
for i in /etc/rc$runlevel.d/S* ; do
        check_runlevel "$i" || continue
        # Check if the subsystem is already up.
        subsys=${i#/etc/rc$runlevel.d/S??}
        [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ]                 && continue 
                #如果运行级别切换之前,已经启动了该服务就直接退出。
                #防止一个服务启动两次。目录/var/lock/subsys/下锁文件的作用。
        # If we‘re in confirmation mode, get user confirmation
        if [ -f /var/run/confirm ]; then
                confirm $subsys
                test $? = 1 && continue
        fi
          #如果当前运行级别下(/etc/rc.d/rc$runlevel.d)的half脚本是S开头的
          #就会运行该脚本,该脚本是关闭计算机的,
        update_boot_stage "$subsys"
        # Bring the subsystem up.
        if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
                export LC_ALL=C      
                exec $i start
        fi
        if LC_ALL=C egrep -q "^..*init.d/functions" $i                         || [ "$subsys" = "single" -o "$subsys" = "local" ]; then
                $i start
        else
                action $"Starting $subsys: " $i start
        fi
done
rm -f /var/run/confirm
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
  /usr/bin/rhgb-client --quit
fi

linux系统运行级别改变时,系统所做的工作,布布扣,bubuko.com

时间: 2024-10-06 06:20:50

linux系统运行级别改变时,系统所做的工作的相关文章

Linux 系统运行级别(SysVinit 系统)

个人博客首页(点击查看详情) -- https://blog.51cto.com/11495268个人微信公众号(点击查看详情) -- https://blog.51cto.com/11495268/2401194     1.简介     systemctl 基础操作 学习中,接触 系统运行级别 之间的 切换,本文 描述 SysVinit 系统运行级别 基本概念 # lsb_release -a No LSB modules are available. Distributor ID: Ubu

aix 系统运行级别

系统启动后可以运行在不同的级别上.有时候为了进行系统维护或者为了运行某些特殊的程序,我们需要改变系统的运行级别.在本文中,你将了解到如何检测系统的运行级别.如何改变系统的运行级别等知识. 1.什么是系统的运行级别?系统的运行级别是一种软件设置.这种软件设置是用来控制在该设置下,只有被选择的一组进程才能存在.换句话说,系统运行在不同的运行级别上,那么系统中可以有不同的进程在运行.系统的运行级别包括以下这些级别中的某一个:0-9: 这10种运行级别代表着系统的10种设置.当我们把系统的运行级别从一级

centos7系统运行级别简介

centos7系统运行级别简介我们知道,centos6及之前的版本中,系统运行级别通过/etc/inittab文件进行设置和控制,但在centos7中,对这个文件的设置将不会对系统运行级别产生影响,这也是centos7中变化比较大的一部分特性.下面,我们就来介绍下系统运行级别方面的内容. 1. 运行级别对应关系 init level           systemctl target    0                      shutdown.target    1         

Linux的运行级别和chkconfig用法

Linux的运行级别和chkconfig用法        一.Linux的运行级别 在装MySQL的时候,才知道了Linux的运行级别这么一回事.汗…自己太水了…下面总结一下: 什么是运行级别呢?简单点来说,运行级别就是操作系统当前正在运行的功能级别.级别是从0到6,具有不同的功能.这些级别定义在/ect/inittab文件中.这个文件是init程序寻找的主要文件,最先运行的服务是那些放在/ect/rc.d目录下的文件.        Linux下的7个运行级别: 0à系统停机状态,系统默认运

Linux runlevel 运行级别

runlevel可以认为是系统状态,形象一点,您可以认为runlevel有点象微软的windows操作系统中的Normal,safemode,和Command prompt only. Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多用户状态(没有NFS)运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式运行级别4:系统未使用,

linux的运行级别介绍

linux的运行级别,指的是linux所工作的模式.linux有0-6这7种运行级别,分别代表着linux可以工作的7种模式,下面分别介绍这7个模式所的意义 0     关机,当运行级别为0的时候,表示关机状态 1     单用户模式,这个工作模式下的linux主机只允许root用户且必须在本地(注意是本地,不能网络远程登 录)登录,其他用户不能登录.这个模式主要用于管理员维护,类似于windows的安全模式.这个模式在忘记root密码很有用,可以以这个模式进入系统,修改重置root密码. 2

Android应用程序框架层和系统运行库层日志系统源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6598703 在开发Android应用程序时,少不了使用Log来监控和调试程序的执行.在上一篇文章Android日志系统驱动程序Logger源代码分析中,我们分析了驱动程序Logger的源代码,在前面的文章浅谈Android系统开发中Log的使用一文,我们也简单介绍在应用程序中使Log的方法,在这篇文章中,我们将详细介绍Android应用程序框架

Linux的运行级别

一.Linux的运行级别 1.查看当前运行级别的命令:runlevel     2.每个运行级别的作用 二.各运行级别下的含义 1.init 0(关机) # ls /etc/rc.d/rc0.d K05wdaemon             K60crond               K84NetworkManager        K90network     K10saslauthd             K73winbind            K84wpa_supplicant  

在linux中运行py文件时,及时知道错误信息

为了能在linux中运行py文件时,及时知道错误信息,可以通过以下代码 commands.getstatusoutput("echo %s %s >> /tmp/debug.log" % (brand, version)) 将brand和version的值放置/tmp/debug.log中用以查看.