2024年3月31日发(作者:)

Linux关机命令分析

linux下有关关机重启的命令主要有:shutdown、reboot、halt、poweroff、telinit、init。

它们都可以达到关机或重启的目的,但是每个命令的工作流程并不一样。它们都由软件包

sysvinit生成,你可以从网上下载它的源码来分析各个命令的流程,同时,sysvinit也包

含了与登陆等有关的命令。下面分析sysvinit-2.86软件包的源码,同时参考它们的手册来

对它们深入了解。

1、从Makefile可以知道,上面的命令并不都是互相独立的,poweroff、reboot是halt

的链接,telinit是init的链接。

ln -sf halt $(ROOT)/sbin/reboot

ln -sf halt $(ROOT)/sbin/poweroff

ln -sf init $(ROOT)/sbin/telinit

在终端输入

# ls -l /sbin/poweroff

# ls -l /sbin/reboot

# ls -l /sbin/telinit

也可以看到上面的结果。

2、halt。

参数说明:

[-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超

级块〔superblock〕覆盖修补过的超级块。

[-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。

[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。

[-f] 没有调用shutdown而强制关机或重启(halt/reboot)。

[-h] 使硬盘处于standby模式。

[-i] 关掉所有的网络接口。

[-p] 该选项为缺省选项。就是关机时调用poweroff。

前面已经知道,poweroff、reboot是halt的链接,halt会首先判断用户执行的是否是

poweroff和reboot中的一个。如果执行的是poweroff,则等效于-p参数,执行reboot

的情况将在下面说明。

解析命令行参数后,会调用geteuid系统调用判断是否为root用户,如果为普通用户,halt

退出。

接下来即是针对不同的参数执行不同操作的过程。首先是不带任何参数的情况(或者参数中

不含-w或-f),halt会通过INIT_VERSION和RUNLEVEL环境变量,或者读取

/var/run/utmp文件(通过linux的用户组函数)获得系统所在的运行级。如果系统不在

0和6运行级,会判断执行的是否reboot,如果用户执行reboot,则调用"shutdown -r";

否则执行"shutdown -h"。

其它情况下,都是通过调用reboot系统调用来达到关机或重启的目的,有关reboot系统

调用,可以使用man 2 reboot命令查看它的手册。如果开启了CTRL-ALT-DEL,同时按

下CTRL-ALT-DEL时,会调用reboot(RB_ENABLE_CAD)重启;如果用户执行的是

poweroff命令,会调用reboot(RB_POWER_OFF)关机。

按照默认设置,/etc/inittab文件指定你的系统可在控制台使用CTRL-ALT-DEL键组合来

关闭并重启系统。如果你想完全禁止这个功能,需要将/etc/inittab文件中下面一行注释掉:

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

上面命令里的-a选项通知shutdown命令寻找/etc/文件,并把

CTRL-ALT-DEL的功能限定给某些用户。详见shutdown命令部分。

3、运行级。

所谓运行级别是一种系统软件环境配置,在此特定的环境中只允许某一组选定的进程存在。

init 给不同的运行级别派生的进程在 /etc/inittab 文件中定义。 Init 可以启动到8个不

同的运行级别上:0-6 和 S 或 s。运行级别可以由超级用户通过 telinit 命令来转换,此

命令可以将转换信号传递给 init,告诉它切换到哪个运行级别。

运行级别0,1,和 6为系统保留的专用运行级别。运行级别 0 用来关机,运行级别 6 用

来重启,运行级别 1 用来使计算机进入单用户模式。运行级别 S 不是给我们直接使用的,

更多是为进入运行级别 1 时运行某些可执行脚本时被调用。

运行级 7-9 虽然在文档中说明,但也可以使用。不使用它们的原因只是因为"传统" Unix

变种不使用这些运行级别。另外,运行级别 S 和运行级别 s 实际上是相同的,它们只是

系统内同一运行级别的两个不同的别名而己。

可以使用sysvinit包的runlevel命令获得系统当前的运行级,不用加任何参数,直接在终

端执行runlevel即可(也是通过用户组相关的函数读取/var/run/utmp文件获得)。下面

是几个运行级的简单介绍:

# 0 - 关机(千万不要把initdefault 设置为0 )

# 1 - 单用户模式

# 2 - 多用户,但是没有 NFS

# 3 - 完全多用户模式

# 4 - 没有用到

# 5 - X11

# 6 - 重启(千万不要把initdefault 设置为6 )

4、shutdown。

shutdown 命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登

录用户提示一条警告信息。该命令还允许用户指定一个时间参数,可以是一个精确的时间,

也可以是从现在开始的一个时间段。所有进程都将接收到 SIGTERM 信号。这可以使 vi 等

程序有时间将处于编辑状态的文件进行存储,邮件和新闻程序进程则可以将所有缓冲池内的

数据进行适当的清除等等。

shutdown 通过通知 init 进程,要求它改换运行级别来实现。运行级别 0 用来关闭系统,

运行级别 6 用来重启系统,运行级别 1 用来使系统进入执行系统管理任务状态,如果没

有给出 -h 或 -r 参数时,这是 shutdown 命令的默认工作状态。系统执行该命令后,会