建议使用下面的命令关机和重启:

              关机:
              [root@initroot ~]# shutdown now
              重启:
              [root@initroot ~]# shutdown -r now
              退出当前shell:
              [root@initroot ~]# exit
            

linux是多用户多任务操作系统,可以有多个用户同时在线,如果贸然关机,就会影响到其他用户的工作。 在关机之前需要先通过write或者wall命令通知用户做好关机前的准备工作。 更合理的做法是使用shutdown命令来通知用户并关机。
Linux内存和磁盘多采用异步传输模式,在内存中的数据并不会立刻写入磁盘中。 错误的关机方法可能会导致内存中数据来不及保存而造成磁盘文件系统的破坏!
在企业实际生产环境下,关机和重启直接影响到企业的生产经营活动! 除非系统管理员清楚自己在做什么,否则是不能随意关闭Linux主机的。
在真正关机之前,需要先观察一下系统的状态。 可以先通过who命令查看系统中所有在线的用户,通过netstat -a命令查看linux主机的网络联机状态。 通过ps -aux查看当前系统中所有正在运行的进程状态。 通过这些命令可以大致了解主机的状态,从而判断是否适合关机。
常用的关机和重启命令有shutdown、reboot、halt、poweroff等,以及手动将数据写入硬盘的sync命令。

1.exit命令

回到顶部

在企业生产环境下,linux很少需要关闭或重启。只要不断开电源,linux可以一直稳定的运行下去。 在实际的运维工作中我们很少会关闭或重启linux主机,毕竟关闭或重启linux并不是一个人的事情, 还和linux上登录的所有在线用户都有关系。如果linux主机中运行着某个项目,那么和项目相关的整个团队都会受到系统关机或重启的影响! 所以关机和重启操作真是慎之又慎的重大操作。
大多数时候我们是通过ssh工具远程连接到linux主机,在处理完相应的工作后,直接使用exit命令退出系统就可以了。
一般我们都是以普通用户登录linux,但在处理一些系统性方面的工作是可能需要root权限,有时候会使用su命令切换到root用户, 在处理完相应的工作后,也要用exit命令及时退出:

              [peter@initroot ~]$ exit
            
exit关闭当前登录会话有关的进程,只是退出登录,exit并没有关闭linux。
如果是通过ssh远程连接linux主机,exit会关闭ssh远程连接以及由ssh产生的相关登录会话进程。
如果是本地登录linux主机,exit关闭login进程产生的登录会话进程,退出登陆后,系统又会回到login登录界面。

2.sync命令

回到顶部

sync命令可以将内存中的数据立刻写入磁盘中,类似vim文本编辑器的保存指令。 vim保存的是正在编辑处理的文本数据,而sync保存的是在内存中的linux系统数据。

              [root@initroot ~]# sync
            
我们在计算机系统原理中已经了解到所有的数据在被CPU处理之前都要先读入内存, 数据经cpu处理后还会再放入内存中,用户需要的结果数据会由内存写到硬盘中,这就是保存的动作。
例如用vim文本编辑器编辑/etc/nginx.conf文件,/etc/nginx.conf由硬盘读入内存, 正在编辑的文件数据存放在内存中,编辑完后需要按下:w将文件保存后才能退出vim。这个保存的动作其实就是将内存中的文件数据写入磁盘中。
硬盘的速度慢于内存,数据在内存与硬盘中来回读写会大大降低系统的性能。 为了不影响系统的整体性能,某些已经加载到内存中的数据不会立刻写回硬盘,而是先暂存在内存中,在未来某个时刻才回写到磁盘中。 但是如果在保存之前系统突然断电,数据没有来得及写入硬盘!就可能造成系统数据的丢失,再次启动后就可能会出现一些莫名奇妙的错误!
一个良好的习惯是经常使用sync命令,特别是在系统关机或重启之前,一定要多执行几次snyc命令! 不过让用户经常性的去执行sync命令确实是很愚蠢的行为,事实上linux在后台会定期执行sync, shutdown/reboot/halt等命令在执行之前也会自动执行sync。
不过,经常性的手动执行sync命令也不失为一个良好的习惯。 要注意的是一般身份用户也可以执行sync命令,只不过保存的只是和用户自己相关的数据。
而root用户可以保存整个系统的数据。
所以在执行sync命令之前最好先su -切换到root用户:
              [peter@study ~]$ su -
              Password:
              Last login: Mon Jun
              1 16:10:12 CST 2020 on pts/0
              [root@initroot ~]# sync
            

3.shutdown命令

回到顶部

linux允许本地登录的普通用户关机或重启。 而使用ssh或putty等远程登录工具登录的普通用户是没有权限关机或重启linux的,只有root才能有权限关机或重启! 某些发行版在关机时还要求必须输入root密码!
最常使用的关机和重启命令就是shutdown命令,shutdown在关机之前会先通知系统中的一些重要服务进程(processes), 以便这些系统服务进程在关机之前可以正常关闭。 shutdown也是推荐的安全关机命令,shutdown命令既可以用来关机也可以用来重启,并且可以设置关机或重启的时间。 shutdown命令在关机或重启之前会通知系统中所有在线的用户,可以自定义通知信息。 另外我们也可以用shutdown命令给在线用户发送一些警告信息。
shutdown命令的使用规则如下:

              [root@initroot ~]# shutdown [-krhc] [时间] [警告信息]
            
选项与参数:
-k : 只发送警告信息,并不关机!
-r : 重启选项(常用),重启之前会先停掉系统服务;
-h : 关机选项(常用),关机之前会先停掉系统服务;
-c : 取消正在进行的shutdown命令计划。
例如希望系统10分钟后关系,并且在关机之前给所有的在线用户发送消息'I will shutdown after 10 mins':
              [root@initroot ~]# /sbin/shutdown -h 10 'I will shutdown after 10 mins'
              Shutdown scheduled for Sat 2020-02-22 20:53:16 CST, use 'shutdown -c' to cancel.
              I will shutdown after 10 mins
              The system is going down for power-off at Sat 2020-02-22 20:53:16 CST!
            
可以输入shutdown -c来取消这次关机命令。 如果没有时间参数,shutdown命令默认会在1分钟后自动执行。
以前shutdown后面一定得加时间参数才行,如果没有加上的话,系统会跳到单人维护模式!
如果想让系统立刻关机,时间参数可以使用now:
              [root@initroot ~]# shutdown -h now
            
这里的now相当于0;
希望系统在今天的20:25自动关机:
              [root@initroot ~]# shutdown -h 20:25
            
如果上面的命令是在20:25之后执行的,就会在第二天的20:25关机;
十分钟后自动关机:
              [root@initroot ~]# shutdown -h +10
            
立刻重启:
              [root@initroot ~]# shutdown -r now
            
30分钟后重启,重启之前通知所有在线用户,通知消息为'The system will reboot':
              [root@initroot ~]# shutdown -r +30 'The system will reboot'
            
给所有在线用户发出遵守法律警告,但不关机:
              [root@initroot ~]# shutdown -k now 'Please abide by Chinese laws,anything against the law and discipline is forbidden!'
            

4.reboot、halt和poweroff命令

回到顶部

reboot命令用于重启系统, halt和poweroff用于关机。 一般重启时,都会像下面这样执行reboot:

              [root@initroot ~]# sync
              [root@initroot ~]# sync
              [root@initroot ~]# sync
              [root@initroot ~]# reboot
            
就像前面提到的,习惯性的多执行几次sync.

halt实际调用的是shutdown -h now,halt将杀死应用进程,执行sync系统调用,完成后就会停止内核运行。halt是停掉系统,但主板没有断电。 系统停止~屏幕可能会保留系统已经停止的讯息:

              [root@initroot ~]# sync; sync; sync; halt
            
poweroff断电关机,直接切断主板的电源,但实际过程依然是先关闭系统,最后断电的。 系统关机,没有提供额外的电力,屏幕空白:
              [root@initroot ~]# sync; sync; sync; poweroff
            
更多halt与poweroff的选项功能,请查询man page! 事实上shutdown、reboot、halt和poweroff这些命令最终都是调用的systemctl命令。

5.systemctl命令

回到顶部

传统的linux有个init命令,该指令可以切换不同的运行等级,运行等级共有0~6七个,其中0就是关机、6是重新启动。 所以执行init 0可以关机,执行init 6可以重启系统。 为了兼容以前的使用习惯,现在的linux发行版也可以执行init命令。不过现在的init命令和以前的init命令在内部实现是完全不一样的, 基本上就是两个完全无关的东西。
上面提到的所有关机和重启的命令halt, poweroff, reboot, shutdown、init等内部都是调用的systemctl命令。 systemctl命令是linux下最新的系统服务管理命令。 systemctl命令涉及的管理功能非常庞杂,这里只了解和关机重启有关的参数选项即可。 systemctl命令用法如下所示:

              [root@initroot ~]# systemctl [指令]
            
和关机重启有关的指令参数:
halt: 进入系统停止的模式,屏幕可能会保留一些讯息,与电源管理模式有关;
poweroff: 进入系统关机模式,直接关机没有提供电力;
reboot: 重新启动;
suspend: 进入休眠模式;
重新启动系统:
              [root@initroot ~]# systemctl reboot
            
系统关机:
              [root@initroot ~]# systemctl poweroff
            
systemctl详细介绍查看 linux系统服务管理

initroot编辑整理,转载请注明出处 www.initroot.com