在 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 参数说明

  1. -t 在改变到其它 runlevel 之前,告诉 init 多久以后关机
  2. -r 重启计算机
  3. -k 并不是真正关机,只是送警告信号给每位登陆者
  4. -h 关机后关闭电源
  5. -n 不用 init,而是自己来关机
  6. -c 取消目前正在执行的关机程序
  7. -f 在重启计算机时忽略 fsck
  8. -F 在重启计算机时强迫 fsck
  9. -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 命令可以关机或重新启动。