4.5 正确的关机方法

OK!大概知道开机的方法,也知道基本的指令操作,而且还已经知道线上查询了,好累呦! 想去休息呢!那么如何关机呢?我想,很多朋友在DOS的年代已经有在玩计算机了! 在当时我们关掉DOS的系统时,常常是直接关掉电源开关,而 Windows 在你不爽的时候,按着电源开关四秒也可以关机!但是在Linux则相当的不建议这么做!

Why?在 Windows (非 NT 主机系统) 系统中,由于是单人假多任务的情况,所以即使你的计算机关机, 对于别人应该不会有影响才对!不过呢,在 Linux 下面,由于每个程序 (或者说是服务) 都是在在背景下执行的,因此,在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作, 例如浏览网页啦、传送信件啦以 FTP 传送文件啦等等的,如果你直接按下电源开关来关机时, 则其他人的数据可能就此中断!那可就伤脑筋了!

此外,最大的问题是,若不正常关机,则可能造成文件系统的毁损 (因为来不及将数据回写到文件中,所以有些服务的文件会有问题!)。所以正常情况下,要关机时需要注意下面几件事:

  • 观察系统的使用状态:如果要看目前有谁在线上,可以下达“who”这个指令,而如果要看网络的连线状态,可以下达 “ netstat -a ”这个指令,而要看背景执行的程序可以执行“ ps -aux ”这个指令。使用这些指令可以让你稍微了解主机目前的使用状态!当然啰,就可以让你判断是否可以关机了 (这些指令在后面Linux常用指令中会提及喔!)
  • 通知线上使用者关机的时刻:要关机前总得给线上的使用者一些时间来结束他们的工作,所以,这个时候你可以使用 shutdown 的特别指令来达到此一功能。
  • 正确的关机指令使用:例如 shutdown 与 reboot 两个指令!

所以下面我们就来谈一谈几个与关机/重新开机相关的指令啰!

  • 将数据同步写入硬盘中的指令: sync
  • 惯用的关机指令: shutdown
  • 重新开机,关机: reboot, halt, poweroff

Tips 由于Linux系统的关机/重新开机是很重大的系统运行,因此只有root才能够进行例如shutdown, reboot等指令。 不过在某些distributions当中,例如我们这里谈到的CentOS系统,他允许你在本机前的tty1~tty7当中(无论是文字界面或图形界面), 可以用一般帐号来关机或重新开机!但某些distributions则在你要关机时,他会要你输入root的密码呢!^_^

  • 数据同步写入磁盘: sync 在 第零章、计算机概论 里面我们谈到过数据在计算机中运行的模式, 所有的数据都得要被读入内存后才能够被CPU所处理,但是数据又常常需要由内存写回硬盘当中(例如储存的动作)。 由于硬盘的速度太慢(相对于内存来说),如果常常让数据在内存与硬盘中来回写入/读出,系统的性能就不会太好。

因此在Linux系统中,为了加快数据的读取速度,所以在默认的情况中, 某些已经载入内存中的数据将不会直接被写回硬盘,而是先暂存在内存当中,如此一来, 如果一个数据被你重复的改写,那么由于他尚未被写入硬盘中,因此可以直接由内存当中读取出来, 在速度上一定是快上相当多的!

不过,如此一来也造成些许的困扰,那就是万一你的系统因为某些特殊情况造成不正常关机 (例如停电或者是不小心踢到power)时,由于数据尚未被写入硬盘当中,哇!所以就会造成数据的更新不正常啦! 那要怎么办呢?这个时候就需要sync这个指令来进行数据的写入动作啦! 直接在命令行下输入sync,那么在内存中尚未被更新的数据,就会被写入硬盘中!所以,这个指令在系统关机或重新开机之前, 很重要喔!最好多执行几次!

虽然目前的 shutdown/reboot/halt 等等指令均已经在关机前进行了 sync 这个工具的调用,不过,多做几次总是比较放心点~呵呵~

[dmtsai@study ~]$ su -   # 这个指令在让你的身份变成 root !下面请输入 root 的密码!
Password:  # 就这里!请输入安装时你所设置的 root 密码!
Last login: Mon Jun  1 16:10:12 CST 2015 on pts/0
[root@study ~]# sync

Tips 事实上sync也可以被一般帐号使用喔!只不过一般帐号使用者所更新的硬盘数据就仅有自己的数据,不像root可以更新整个系统中的数据了。

  • 惯用的关机指令: shutdown 由于Linux的关机是那么重要的工作,因此除了你是在主机前面以实体终端机 (tty1~tty7) 来登陆系统时, 不论用什么身份都能够关机之外,若你是使用远端管理工具(如通过pietty使用SSH服务来从其他计算机登陆主机), 那关机就只有root有权力而已喔!

嗯!那么就来关机试试看吧!我们较常使用的是shutdown这个指令,而这个指令会通知系统内的各个程序 (processes),并且将通知系统中的一些服务来关闭。shutdown可以达成如下的工作:

  • 可以自由选择关机模式:是要关机或重新开机均可;
  • 可以设置关机时间: 可以设置成现在立刻关机, 也可以设置某一个特定的时间才关机。
  • 可以自订关机讯息:在关机之前,可以将自己设置的讯息传送给线上 user 。
  • 可以仅发出警告讯息:有时有可能你要进行一些测试,而不想让其他的使用者干扰,或者是明白的告诉使用者某段时间要注意一下!这个时候可以使用 shutdown 来吓一吓使用者,但却不是真的要关机啦! 那么shutdown的语法是如何呢?聪明的读者大概已经开始找“男人”了!没错,随时随地的 man 一下,是很不错的举动!好了,简单的语法规则为:
[root@study ~]# /sbin/shutdown [-krhc] [时间] [警告讯息]
选项与参数:
-k     : 不要真的关机,只是发送警告讯息出去!
-r     : 在将系统的服务停掉之后就重新开机(常用)
-h     : 将系统的服务停掉后,立即关机。 (常用)
-c     : 取消已经在进行的 shutdown 指令内容。
时间   : 指定系统关机的时间!时间的范例下面会说明。若没有这个项目,则默认 1 分钟后自动进行。
范例:
[root@study ~]# /sbin/shutdown -h 10 'I will shutdown after 10 mins'
Broadcast message from root@study.centos.vbird (Tue 2015-06-02 10:51:34 CST):
I will shutdown after 10 mins
The system is going down for power-off at Tue 2015-06-02 11:01:34 CST!

在执行 shutdown 之后,系统告诉大家,这部机器会在十分钟后关机!并且会将讯息显示在目前登陆者的屏幕前方! 你可以输入“ shutdown -c ”来取消这次的关机指令。而如果你什么参数都没有加,单纯执行 shutdown 之后, 系统默认会在 1 分钟后进行“关机”的动作喔!我们也提供几个常见的时间参数给你参考!

Tips 与旧版不同的地方在于,以前 shutdown 后面一定得要加时间参数才行,如果没有加上的话,系统会跳到单人维护模式中。 在这一版中,shutdown 会以 1 分钟为限,进行自动关机的任务!真的很不一样喔!所以时间参数可以不用加啰!

[root@study ~]# shutdown -h now
立刻关机,其中 now 相当于时间为 0 的状态
[root@study ~]# shutdown -h 20:25
系统在今天的 20:25 分会关机,若在21:25才下达此指令,则隔天才关机
[root@study ~]# shutdown -h +10
系统再过十分钟后自动关机
[root@study ~]# shutdown -r now
系统立刻重新开机
[root@study ~]# shutdown -r +30 'The system will reboot' 
再过三十分钟系统会重新开机,并显示后面的讯息给所有在线上的使用者
[root@study ~]# shutdown -k now 'This system will reboot' 
仅发出警告信件的参数!系统并不会关机啦!吓唬人!
  • 重新开机,关机: reboot, halt, poweroff 还有三个指令可以进行重新开机与关机的任务,那就是reboot, halt, poweroff。 其实这三个指令调用的函数库都差不多,所以当你使用“man reboot”时,会同时出现三个指令的用法给你看呢。 其实鸟哥通常都只有记poweroff与reboot这两个指令啦!一般鸟哥在重新开机时,都会下达如下的指令喔:
[root@study ~]# sync; sync; sync; reboot

既然这些指令都能够关机或重新开机,那他有没有什么差异啊?基本上,在默认的情况下, 这几个指令都会完成一样的工作!(全部的动作都是去调用 systemctl 这个重要的管理命令!) 所以,你只要记得其中一个就好了!重点是,你自己习惯即可!

[root@study ~]# halt      # 系统停止~屏幕可能会保留系统已经停止的讯息!
[root@study ~]# poweroff  # 系统关机,所以没有提供额外的电力,屏幕空白!

更多halt与poweroff的选项功能,请务必使用man去查询一下喔!

  • 实际使用管理工具 systemctl 关机 如果你跟鸟哥一样是个老人家,那么一定会知道有个名为 init 的指令,这个指令可以切换不同的执行等级~ 执行等级共有 0~6 七个,其中 0 就是关机、6 就是重新开机等等。不过,这个 init 目前只是一个相容模式而已~ 所以在 CentOS 7 当中,虽然你依旧可以使用“ init 0 ”来关机,但是那已经跟所谓的“执行等级”无关了!

那目前系统中所有服务的管理是使用哪个指令呢?那就是 systemctl 啦!这个指令相当的复杂!我们会在很后面系统管理员部份才讲的到! 目前你只要学习 systemctl 当中与关机有关的部份即可。要注意,上面谈到的 halt, poweroff, reboot, shutdown 等等,其实都是调用这个 systemctl 指令的喔! 这个指令跟关机有关的语法如下:

[root@study ~]# systemctl [指令]
指令项目包括如下:
halt       进入系统停止的模式,屏幕可能会保留一些讯息,这与你的电源管理模式有关
poweroff   进入系统关机模式,直接关机没有提供电力喔!
reboot     直接重新开机
suspend    进入休眠模式
[root@study ~]# systemctl reboot    # 系统重新开机
[root@study ~]# systemctl poweroff  # 系统关机