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

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

    • 观察系统的使用状态:如果要看目前有谁在线上,可以下达“who”这个指令,而如果要看网络的连线状态,可以下达 “ netstat -a ”这个指令,而要看背景执行的程序可以执行“ ps -aux ”这个指令。使用这些指令可以让你稍微了解主机目前的使用状态!当然啰,就可以让你判断是否可以关机了 (这些指令在后面Linux常用指令中会提及喔!)

    • 通知线上使用者关机的时刻:要关机前总得给线上的使用者一些时间来结束他们的工作,所以,这个时候你可以使用 shutdown 的特别指令来达到此一功能。

    • 正确的关机指令使用:例如 shutdown 与 reboot 两个指令!

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

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

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

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

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

    鸟哥的图示

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

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

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

    • 可以自由选择关机模式:是要关机或重新开机均可;
    • 可以设置关机时间: 可以设置成现在立刻关机, 也可以设置某一个特定的时间才关机。
    • 可以自订关机讯息:在关机之前,可以将自己设置的讯息传送给线上 user 。
    1. 选项与参数:
    2. -k 不要真的关机,只是发送警告讯息出去!
    3. -r 在将系统的服务停掉之后就重新开机(常用)
    4. -h 将系统的服务停掉后,立即关机。 (常用)
    5. -c 取消已经在进行的 shutdown 指令内容。
    6. 时间 指定系统关机的时间!时间的范例下面会说明。若没有这个项目,则默认 1 分钟后自动进行。
    7. [root@study ~]# /sbin/shutdown -h 10 'I will shutdown after 10 mins'
    8. Broadcast message from root@study.centos.vbird Tue 2015-06-02 10:51:34 CST):
    9. The system is going down for power-off at Tue 2015-06-02 11:01:34 CST!

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

    • 重新开机,关机: reboot, halt, poweroff
      还有三个指令可以进行重新开机与关机的任务,那就是reboot, halt, poweroff。 其实这三个指令调用的函数库都差不多,所以当你使用“man reboot”时,会同时出现三个指令的用法给你看呢。 其实鸟哥通常都只有记poweroff与reboot这两个指令啦!一般鸟哥在重新开机时,都会下达如下的指令喔:
    1. [root@study ~]# sync; sync; sync; reboot

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

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

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

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

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