天天看点

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

<code># 其实计算机的关闭也就是运行级别的切换;</code>

<code># init进程监控运行级别是否改变。</code>

<code># 如果运行级别改变了,init进程就会触发 /etc/rc.d/rc 脚本运行。</code>

<code># rc 脚本作用是:</code>

<code>#    1、如果当前计算机运行有,在当前运行级别</code>

<code>#   (correctrunlevel )/etc/rc.d/rc$runlevel.d/目录下以K开头的服务。就关闭。</code>

<code>#     2、开启当前运行级别(correct runlevel )/etc/rc.d/rc$runlevel.d/目录下#   以S开头的服务</code>

<code>#这样就实现了,不同运行级别的所允许启动、禁止启动的服务的控制。</code>

<code>#如果当前运行级别(correct runlevel )/etc/rc.d/rc$runlevel.d/目录下以S开头的#服务脚本有:half 就会关闭计算机。</code>

<code>#[root@node2 rc.d]# ll rc0.d/S*</code>

<code>lrwxrwxrwx 1 root root 17 Apr  5 00:13 rc0.d</code><code>/S00killall</code> <code>-&gt;..</code><code>/init</code><code>.d</code><code>/killall</code>

<code>lrwxrwxrwx 1 root root 14 Apr  5 00:13 rc0.d</code><code>/S01halt</code> <code>-&gt; ..</code><code>/init</code><code>.d</code><code>/halt</code>

<code># 会先执行kill脚本再执行halt脚本。</code>

<code># 其实系统管理员发出【shutdown】命令,就是通知 init 进程,运行级别改变了。</code>

<code>[root@node2 ~]</code><code># man shutdown</code>

<code>.....</code><code>shutdown</code> <code>does its job by signalling the init process, asking it to change the runlevel.</code>

<code>......</code>

<code># 进程init的配置文件/etc/inittab 定义等级切换时动作</code>

<code>[root@node2 ~]</code><code># vim /etc/inittab</code>

<code>l0:0:wait:</code><code>/etc/rc</code><code>.d</code><code>/rc</code> <code>0  </code><code># 在开机时,或改变运行等级时都会执行</code>

<code>l1:1:wait:</code><code>/etc/rc</code><code>.d</code><code>/rc</code> <code>1</code>

<code>l2:2:wait:</code><code>/etc/rc</code><code>.d</code><code>/rc</code> <code>2</code>

<code>l3:3:wait:</code><code>/etc/rc</code><code>.d</code><code>/rc</code> <code>3</code>

<code>l4:4:wait:</code><code>/etc/rc</code><code>.d</code><code>/rc</code> <code>4</code>

<code>l5:5:wait:</code><code>/etc/rc</code><code>.d</code><code>/rc</code> <code>5</code>

<code>l6:6:wait:</code><code>/etc/rc</code><code>.d</code><code>/rc</code> <code>6</code>

<code># 这些行表示在系统的运行级别每次发生变化时都就当运行一次rc程序(/etc/rc.d/rc脚本),</code>

<code># 而且init应当将一个包含运行级别号(0~~6)的单字符参数传递给rc程序。</code>

<code># 会监控主机的运行等级的变化,如运行等级变化了就会调用:/etc/rc.d/rc 脚本</code>

<code># 假如当前主机的运行等级是:</code>

<code>[root@node2 bin]</code><code># runlevel</code>

<code>N 3</code>

<code># 作用命令init 发出关闭程序信号使用: </code>

<code>[root@node2 bin]</code><code># init 0  </code>

<code># init进程发现运行等级改变就会按照配置文件inittab中的 l0:0:wait:/etc/rc.d/rc # 0执行相关操作。  </code>

<code>[root@node2 ~]</code><code># vim /etc/rc.d/rc</code>

<code>#! /bin/bash</code>

<code>#</code>

<code># rc            This file is responsible for starting/stopping</code>

<code>#               services when the runlevel changes.</code>

<code># Original Author:</code>

<code>#               Miquel van Smoorenburg, &lt;[email protected]&gt;</code>

<code>set</code> <code>-m</code>

<code>###################################################################</code>

<code>#该函数是检查当前运行级别的脚本条件:</code>

<code>#                     1、该脚本必须有可运行权限;</code>

<code>#                     2、不属于函数is_ignored_file 中指定的类型</code>

<code># check a file to be a correct runlevel script</code>

<code>check_runlevel ()</code>

<code>{</code>

<code>        </code><code># Check if the file exists at all.</code>

<code>        </code><code>[ -x </code><code>"$1"</code> <code>] || </code><code>return</code> <code>1</code>

<code>        </code><code>is_ignored_file </code><code>"$1"</code> <code>&amp;&amp; </code><code>return</code> <code>1 </code><code># 调用函数检查文件类型。</code>

<code>        </code><code>return</code> <code>0</code>

<code>}</code>

<code># Now find out what the current and what the previous runlevel are.</code>

<code>argv1=</code><code>"$1"</code>   <code>#记录:运行级别改变时,init进程触发运行rc脚本时传递的参数。</code>

<code>set</code> <code>`</code><code>/sbin/runlevel</code><code>`  </code><code># 记录当前主机的运行级别</code>

<code>runlevel=$2</code>

<code>previous=$1</code>

<code>export</code> <code>runlevel previous</code>

<code>. </code><code>/etc/init</code><code>.d</code><code>/functions</code>

<code># See if we want to be in user confirmation mode</code>

<code>if</code> <code>[ </code><code>"$previous"</code> <code>= </code><code>"N"</code> <code>]; </code><code>then</code>

<code>        </code><code>if</code> <code>[ -f </code><code>/var/run/confirm</code> <code>]; </code><code>then</code>

<code>                </code><code>echo</code> <code>$</code><code>"Entering interactive startup"</code>

<code>        </code><code>else</code>

<code>                </code><code>echo</code> <code>$</code><code>"Entering non-interactive startup"</code>

<code>        </code><code>fi</code>

<code>fi</code>

<code># Get first argument. Set new runlevel to this argument.</code>

<code>[ -n </code><code>"$argv1"</code> <code>] &amp;&amp; runlevel=</code><code>"$argv1"</code> 

<code>  </code><code>#如果进程init监控到运行级别改变时,触发运行rc脚本时传递了参数,</code>

<code>  </code><code>#就把该参数当作当前主机的运行级别</code>

<code># Is there an rc directory for this new runlevel? </code>

<code>   </code><code>#判断运行级别在/etc/目录下是否的对应目录,如果没有就直接退出。</code>

<code>   </code><code>#这也可判断传递的运行参数是否正确</code>

<code>[ -d </code><code>/etc/rc</code><code>$runlevel.d ] || </code><code>exit</code> <code>0</code>

<code>####################################################################</code>

<code>#给/etc/rc.d/rc$runlevel.d目录下的K开头的脚本传递:stop 以实现关闭该运行级别不</code>

<code>#启动的服务</code>

<code># First, run the KILL scripts.          </code>

<code>for</code> <code>i </code><code>in</code> <code>/etc/rc</code><code>$runlevel.d</code><code>/K</code><code>* ; </code><code>do</code>

<code>        </code><code>check_runlevel </code><code>"$i"</code> <code>|| </code><code>continue</code> 

<code>        </code><code>#调用函数check_runlevel检查脚本,如果去一个服务的启动脚本就往下执行,</code>

<code>        </code><code>#否则退出当前循环执行下一次循环</code>

<code>########################如果 $i 是一个服务的启动脚本,判断该脚本(以K开头的脚本)#在运行级别切换之前是否已经启动。</code>

<code>#因为通过脚本启动服务后(如:service httpd start 或 httpd start),</code>

<code>#都会在/var/lock/subsys/目录下创建一个以启动脚本命名的文件</code>

<code>#也正是通过判断/var/lock/subsys/目录下有没有该服务脚本对应的文件,</code>

<code>#来确定该服务是否启动的。</code>

<code>        </code><code># Check if the subsystem is already up.</code>

<code>        </code><code>subsys=${i</code><code>#/etc/rc$runlevel.d/K??}</code>

<code>        </code><code>[ -f </code><code>/var/lock/subsys/</code><code>$subsys -o -f </code><code>/var/lock/subsys/</code><code>$subsys.init ] \</code>

<code>                </code><code>|| </code><code>continue</code>

<code>        </code><code># Bring the subsystem down. </code>

<code>        </code><code>#关闭当前运行级别设置不启动的服务(运行级别切换之前启动的服务,</code>

<code>        </code><code>#但是该服务在当前运行级别是设置不启动的),</code>

<code>        </code><code>if</code> <code>LC_ALL=C </code><code>egrep</code> <code>-q </code><code>"^..*init.d/functions"</code> <code>$i ; </code><code>then</code>

<code>                </code><code>$i stop              </code>

<code>                </code><code>action $</code><code>"Stopping $subsys: "</code> <code>$i stop</code>

<code>done</code>

<code>############### 启动当前运行级别设置启动的服务#####################################################################</code>

<code># Now run the START scripts.</code>

<code>for</code> <code>i </code><code>in</code> <code>/etc/rc</code><code>$runlevel.d</code><code>/S</code><code>* ; </code><code>do</code>

<code>        </code><code>check_runlevel </code><code>"$i"</code> <code>|| </code><code>continue</code>

<code>        </code><code>subsys=${i</code><code>#/etc/rc$runlevel.d/S??}</code>

<code>                </code><code>&amp;&amp; </code><code>continue</code> 

<code>                </code><code>#如果运行级别切换之前,已经启动了该服务就直接退出。</code>

<code>                </code><code>#防止一个服务启动两次。目录/var/lock/subsys/下锁文件的作用。</code>

<code>        </code><code># If we're in confirmation mode, get user confirmation</code>

<code>                </code><code>confirm $subsys</code>

<code>                </code><code>test</code> <code>$? = 1 &amp;&amp; </code><code>continue</code>

<code>          </code><code>#如果当前运行级别下(/etc/rc.d/rc$runlevel.d)的half脚本是S开头的</code>

<code>          </code><code>#就会运行该脚本,该脚本是关闭计算机的,</code>

<code>        </code><code>update_boot_stage </code><code>"$subsys"</code>

<code>        </code><code># Bring the subsystem up.</code>

<code>        </code><code>if</code> <code>[ </code><code>"$subsys"</code> <code>= </code><code>"halt"</code> <code>-o </code><code>"$subsys"</code> <code>= </code><code>"reboot"</code> <code>]; </code><code>then</code>

<code>                </code><code>export</code> <code>LC_ALL=C      </code>

<code>                </code><code>exec</code> <code>$i start</code>

<code>        </code><code>if</code> <code>LC_ALL=C </code><code>egrep</code> <code>-q </code><code>"^..*init.d/functions"</code> <code>$i \</code>

<code>                        </code><code>|| [ </code><code>"$subsys"</code> <code>= </code><code>"single"</code> <code>-o </code><code>"$subsys"</code> <code>= </code><code>"local"</code> <code>]; </code><code>then</code>

<code>                </code><code>$i start</code>

<code>                </code><code>action $</code><code>"Starting $subsys: "</code> <code>$i start</code>

<code>rm</code> <code>-f </code><code>/var/run/confirm</code>

<code>if</code> <code>[ -x </code><code>/usr/bin/rhgb-client</code> <code>] &amp;&amp; </code><code>/usr/bin/rhgb-client</code> <code>--</code><code>ping</code> <code>; </code><code>then</code>

<code>  </code><code>/usr/bin/rhgb-client</code> <code>--quit</code>

     本文转自成长的小虫 51CTO博客,原文链接:http://blog.51cto.com/9528du/1420173,如需转载请自行联系原作者

继续阅读