Linux系统中关机命令详细解析

??? 在Linux系统中,其关机命令就多达六种。分别有shutdown、reboot、halt、poweroff、telinit、init等命令,虽然有些命令相互之间是父子的关系。这些命令都可以达到关机或者重新启动系统的目的,但每个命令的内部工作过程是不同的,下面介绍的就是这些关机命令的特点以及在什么情况下应该采用什么命令。
??? 在这六个命令中,有些命令之间是父子关系。如halt与poweroff两个之间就是父子关系。在halt命令中,如果加入-p参数的话,则其起到的作用就跟poweroff是相同的。如果系统管理员要知道某个关机命令是否是其他关键命令的连接(即与其它关机命令是否有父子关系),可以利用如下命令进行查询:
?ls -l /sbin/poweroff
?ls -l /sbin/halt

1.shutdown?
??? 因为Linux系统是一个多用户系统。在同一个时间内可能有多个用户登录在这个系统上。如通过SSH命令进行远程登录等等。那么系统管理员可能希望在关闭Linux系统之前给当前所有的登录用户发出警告。或者说在十分钟后关闭系统等等。如果系统管理员要实现这个功能,就需要采用shutdown这个关机命令。
??? shutdown 命令可以安全地关闭或重启Linux系统。这个命令会在系统关闭之前给系统上的所有登录用户(包括远程登录的用户)提示一条警告信息。该命令还允许系统管理员指定一个时间参数,在规定的时间后关闭系统。如可以是一个精确的时间(几时几分),也可以是从现在开始的一个时间段(十分钟后)。利用这个命令系统所有进程都将接收到 SIGTERM信号,可以使vi等文本编辑程序有时间将处于编辑状态的文件进行存储。邮件和新闻等应用程序进程则可以将所有缓冲池内的数据进行适当的清除等等。系统管理员运行shutdown命令后,系统会通知init进程,要求它改换运行级别来实现特定的功能。运行级别0用来关闭系统,运行级别6用来重启系统,运行级别1用来使系统进入执行系统管理任务状态。如果没有给出 -h 或 -r 参数时,这是shutdown命令的默认工作状态。系统执行该命令后,会自动进行数据同步的工作。故这个命令的所花费的时间可能要久一点。
  这里提到了一个运行级别的概念,它也是Linux系统与Windows系统差异比较大的一个点。所谓运行级别是一种系统软件环境配置。在某个特定的环境中只允许某一组选定的进程存在。init 给不同的运行级别派生的进程。Init可以启动到8个不同的运行级别上,包括0-6运行级别和S或s运行级别。运行级别可以由超级用户通过telinit命令来转换。此命令可以将转换信号传递给init,告诉它切换到哪个运行级别。运行级别0,1,和 6为系统保留的专用运行级别。运行级别0用来关机,运行级别6用来重启,运行级别1用来使计算机进入单用户模式。运行级别S不是给我们直接使用的,更多是为进入运行级别1时运行某些可执行脚本时被调用。
??? shutdown执行它的工作是送信号〔signal〕给init程序,要求它改变runlevel。Runlevel 0被用来停机〔halt〕,runlevel 6是用来重新激活〔reboot〕系统,而runlevel 1则是被用来让系统进入管理工作可以进行的状态;这是预设的,假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些动作,可以在这个文件/etc/inittab里看到这些runlevels相关的资料。?

shutdown 参数说明:?
   [-t] 在改变到其它runlevel之前,告诉init多久以后关机。?
   [-r] 重启计算器。?
   [-k] 并不真正关机,只是送警告信号给每位登录者〔login〕。?
   [-h] 关机后关闭电源〔halt〕。?
   [-n] 不用init,而是自己来关机。不鼓励使用这个选项,而且该选项所产生的后果往往不总是你所预期得到的。?
   [-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数,但是可以输入一个用来解释的讯息,而这信息将会送到每位使用者。?
   [-f] 在重启计算器〔reboot〕时忽略fsck。?
???? [-F] 在重启计算器〔reboot〕时强迫fsck。?
   [-time] 设定关机〔shutdown〕前的时间。     ?

2.halt—-最简单的关机命令?
??? -n参数,它主要用来防止sync系统调用。Linux系统中有的时候会了提高效率,会把欲写入硬盘的资料先写到 filesystem buffer 中。这个 buffer 是一块内存中的空间。如果欲写入硬盘的资料存于这个buffer中,而系统又突然断电的话,那么资料就会丢失。sync指令会将存于buffer 中的资料强制写入硬盘中。这个功能就好像数据库中的高速缓存一样。可以先把更改的数据写入到内存的一个高速缓存中。然后等到某个特定的时候再把它写入到硬盘中。这种方式可以提高系统性能。不过有的时候管理员需要禁止系统采取sync指令。如系统管理员用fsck命令修补分区之后,为了防止内核用老版本的超级块覆盖修补过的超级块,在关机时就要采用halt –n这个形式来关机,这样在关机的时候不会用老版本的超级块覆盖修补过的超级块。
  如果在halt命令中带了-w参数的话,则并不是真正的重启或者关机。而只是把这个事件记入到wtmp日志文件中。在系统登录时,login登录程序会将一些内容写入到utmp文件中,同时也将其添写到wtmp日志文件中。注销时,init进程将utmp文件中相应的记录擦除,每个字节都填以0。并将一个新的记录添写到wtmp文件中。在系统重新启动时,以及更改系统时间和日期的前后,都在wtmp文件中添写特殊的记录项。也就是说,wtmp日志文件跟踪各个登录和注销事件,以及其他一些特殊的更改。如果系统管理员并不是要真正的关机,而只是想把某个标记写入到wtmp日志文件中,则可以利用这个halt –w命令来完成这个需求。另外,-d是跟-w相反的参数。如果在关机时加入这个参数的话,则关机时不会往wtmp日志文件中加入内容。
??? 利用这个命令,有时候还可以实现节电功能。如在笔记本电脑中,节电模式通常有四种。一是Doze模式,当设定时间一到,CPU时钟变慢,其他设备照常运作。二是Standby模式,当设定时间一到,硬盘和显示将停止工作,其他设备照常运作。三是Suspend模式,当设定时间一到,除CPU以外的所有设备都将停止工作。四是HDD Power Down模式:当设定时间一到,硬盘停止工作,其他设备照常运作。而在Linux操作系统下,他支持的时第二种模式,即Standby模式。如果系统管理员运行halt -h命令,则就是高速Linux操作系统的硬盘处于Standby模式,以节省电。
  另外参数-p是这个命令的缺省选项。如果采用这个参数,则这个命令同poweroff命令就完全相同了。
  需要注意的是,使用halt命令的话,有用户的限制。也就是说,系统在解析命令行参数后,会调用geteuid系统进程判断当前用户是否为root用户。如果是的话进行后续的操作;如果为普通用户,halt退出,并且会向用户提示错误信息。
  其实halt就是调用shutdown -h。halt执行时,杀死应用进程,执行sync系统调用,文件系统写操作完成后就会停止内核。?

参数说明:?
   [-n] 防止sync系统调用,它用在用fsck修补根分区之后,以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。?
   [-w] 并不是真正的重启或关机,只是写wtmp〔/var/log/wtmp〕纪录。?
   [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。?
   [-f] 没有调用shutdown而强制关机或重启。?
   [-i] 关机〔或重启〕前,关掉所有的网络接口。?
   [-p] 该选项为缺省选项。就是关机时调用poweroff。  ?

3.reboot?

reboot的工作过程差不多跟halt一样,不过它是引发主机重启,而halt是关机。它的参数与halt相差不多。?

4.init?

init是所有进程的祖先,它的进程号始终为1,所以发送TERM信号给init会终止所有的用户进程、守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel),init 0为关机,init 1为重启。关于init可以长篇大论,这里就不再叙述。另外还有telinit命令可以改变init的运行级别,比如,telinit -iS可使系统进入单用户模式,并且得不到使用shutdown时的信息和等待时间。

评论已关闭!