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 命令的默认工作状态。系统执行该命令后,会


发布评论