在 Linux 系统下一些常用的关机/重启命令有 shutdown、halt、reboot以及init,他们都可以达到重启系统的目的,但每个命令的内部工作过程不同。
一、使用 shutdown 关机或重启
1. shutdown 命令介绍
shutdown 命令安全地将系统关机,在系统关机前使用 shutdown 命令,系统管理员会通知所有登录的用户系统将要关闭,并且 login 指令会被冻结,即新的用户不能再登录。直接关机或是延时一段时间关机都是可以的,也可以进行重启。
shutdown 执行的工作是送信号给 init 程序,要求它改变 runlevel。 runlevel 0 被用来停机, runlevel 6 用来程序激活系统。 而 runlevel 1 则是被用来让系统进入管理工作可以进行的状态。 如果想要了解在停机或重新开机过程中做了哪些动作,可以在 /etc/inittab 里看到关于这些 runlevel 的 信息。
2. shutdown 参数说明
-t 在改变到其它 runlevel 之前,告诉 init 多久以后关机
-r 重启计算机
-k 并不是真正关机,只是送警告信号给每位登陆者
-h 关机后关闭电源
-n 不用 init,而是自己来关机
-c 取消目前正在执行的关机程序
-f 在重启计算机时忽略 fsck
-F 在重启计算机时强迫 fsck
-time 设关机前的时间
二、最简单的关机指令 halt
halt 就是调用 shutdown -h。 halt 执行时,会杀死应用进程,执行 sync 系统调用,文件系统写操作完成后就会停止内核,与 reboot 不同之处在于 halt 用来关机,而 reboot 用来重启系统。
三、使用 reboot 重启系统
reboot 命令用来重启系统,用法比较简单,在终端命令行以 root 用户执行该命令即可进行系统的重启。
reboot 命令常用参数如下:
-n 在重启之前不执行磁盘刷新
-w 做一次重启模拟,并不会真的重新启动
-d 不把记录写到 /var/log/wtmp 档案里( -n 参数包含了 -d)
-f 强制重开机
-i 在重开机之前先把所有网络相关的装置停止
四、使用 poweroff 终止系统运行
poweroff 就是 halt 或 reboot 命令的软链接。而执行 halt 调用 shutdown -h 。具体如下所示:
[hk@localhost ~]$ which poweroff
/usr/sbin/poweroff
[hk@localhost ~]$ ls -l /sbin/poweroff
lrwxrwxrwx. 1 root root 16 Nov 14 21:00 /sbin/poweroff -> ../bin/systemctl
[hk@localhost ~]$ ls -lhtr /sbin/halt
lrwxrwxrwx. 1 root root 16 Nov 14 21:00 /sbin/halt -> ../bin/systemctl
[hk@localhost ~]$
五、使用 init 命令改变系统运行级别
init 是所有进程的祖先,其进程号始终为 1 ,所以发送 TERM 信号给 init 会终止所有的用户进程、守护进程等。 shutdown 使用的就是这种机制。
init 定义了 7 个运行级别,每个运行级别定义如下:
0 停机
1 单用户模式
2 多用户
3 完全多用户模式
4 没有用到
5 X11(X Window)
6 重新启动
这些级别在 /etc/inittab 里指定。这个文件是 init 程序寻找的主要文件,最先运行的服务是放在 /etc/rc.d 目录下的文件。 在大多数的Linux发行版中,启动脚本都是位于 /etc/rc.d/init.d 中的。这些脚本被用 ln 命令链接到 /etc/rc.d/rcN.d 目录,这里的 N 就是运行级别 0 -6.因此使用 init 命令可以关机或重新启动。