sync; sync; sync; sleep 30; halt
我仍然看到人们在谈论关闭或重新启动 Linux 时建议使用咒语。
我从 Linux 一开始就一直在运行它,虽然这是 BSD 4.2/4.3 和 SunOS 4 天推荐的过程,但我不记得至少在过去十年中我必须这样做,在此期间我可能经历了Linux的关机/重启可能数千次。
我怀疑这是不合时宜的,因为即使在单用户模式(例如/tmp)下,内核也无法卸载和同步根文件系统和其他关键文件系统,因此有必要明确告诉它刷新尽可能多的数据到磁盘。
这些天,还没有在内核源代码中找到相关代码(通过http://lxr.linux.no和谷歌挖掘),我怀疑内核足够聪明,甚至可以干净地卸载根文件系统,并且文件系统足够聪明在正常shutdown
//期间卸载自身之前有效地执行同步(2 reboot
)poweorff
。
"sync; sync; sync"
仅在文件系统无法完全卸载(例如物理磁盘故障)或系统处于仅强制直接重新启动(8)将使其摆脱冻结状态(例如负载太高,让它安排关机命令)。
sync
在卸载可移动设备之前,我也从不执行此过程,也从未遇到问题。
另一个例子 - Xen 允许 DomU 从 Dom0 发送shutdown
命令,这被认为是“干净关闭”,无需任何人先登录并输入魔法sync; sync; sync
。
我是对的还是我幸运地关闭了数千次系统?
人们会
sync; sync
在 a 之前运行的原因halt
是该halt
命令不会在较旧的 linux 上干净地关闭系统。在 SYSVr4 系统上执行此操作的正确方法始终是告诉 init 移动到不同的运行级别。BSD 和 SunOS 4 不是 SYSVr4 操作系统,这就是它们不同的原因。Solaris (SunOS 5) 是 SYSVr4,Linux 挑选出它想要使用的 SYSVr4 标准。
在大多数 UNIX(Linux 是例外之一)上,使用停止实际上是一种非常糟糕的方法,因为它实际上并没有通过 init 脚本运行来执行诸如停止进程和卸载磁盘之类的事情——它只是停止处理器。
如果您可以保证永远不会使用任何类型的 UNIX 系统而不是 Linux,那么您可以继续使用
halt
- 如果您有机会使用其他 UNIX,那么我建议您养成使用init _runlevel_
或shutdown
.该
shutdown
命令实际上告诉init
进程更改其运行级别运行级别- 这样做时 init 然后继续运行与该运行级别关联的每个 K* init 脚本和 S* init 脚本。运行级别 0 中的脚本之一执行文件系统的卸载。在 Linux 上,该
halt
命令只是调用该shutdown
命令,除非运行级别已经是 0(关闭)或 6(重新启动);所以那里没有损失。卸载文件系统的操作
umount
将在卸载之前将数据同步到磁盘。如果您一直
sync; sync; halt
在 Linux 上运行,那么您对文件系统状态会感到满意,因为开发人员已确保这样halt
做是正确的;但是使用以下方法会更正确:shutdown now
我只能说你为什么会
sync
多次发布。该命令安排刷新到磁盘,但在实际刷新完成之前返回。任何后续sync
命令都将阻塞,直到任何未完成的刷新正在进行,然后再安排另一个刷新并退出。因此,sync; sync
确保同步刷新。你不需要做超过 2 次,也不需要sleep
混合。使用多个
sync
调用是为了让操作系统和磁盘有时间刷新写队列。"sync; sync; sync"
被认为没那么有用;有一个"sync<cr> sync<cr> sync<cr"
,而您的 ASR-33 执行回车/换行时的延迟提供了足够的延迟。停止总是调用同步;问题是在断电之前是否有足够的时间来清理队列。原始海报
sync; sleep 30
更符合预期。那些告诉我们“同步;同步;同步”没有任何目的的人正在暴露您的年龄。
回到过去的美好时光,在 Unix 适合青少年使用之前,我们曾经不得不使用 TAPE 来满足我们的流/备份需求。通常,我们会挂载一个基于磁带的文件系统来将备份流式传输到,等等。我们中的一些人都拥有这一长而细的磁性塑料胶带,用于将我们的文件存储在..
'sync;sync;sync' 命令是一种可以告诉这些旧磁带机一直倒带到最后(在关机之前)的方式——它们有可以接收同步 cmd 的固件(就像所有好的文件系统一样)做),并且如果几乎紧跟两个同步缓冲区命令,磁带驱动器本身会将其解释为“倒带并卸载磁带”。除了这种方法之外,没有任何方法可以告诉磁带驱动器倒带,而且它有点卡住了。当硬盘驱动器变得更可用时,这种习惯就传到了这个词中——我们这些顽固的老操作员不只是重新分配( )我们的肌肉记忆你知道的!我相信它在磁带变得不那么普遍并且硬盘变得更加可用之后很快就获得了民间传说的地位,但它仍然对我们这些使用磁带驱动器的人有用。
如果您的系统退化(例如
/bin/sh
isinit
),那么古老的行为会再次出现。halt
将看到它不知道运行级别并且无法命令运行级别更改并实际发出halt
系统调用并立即关闭系统。但是,sync
现在是同步的(至少从 2000 年开始就是这样),您不需要多次运行它。在所有其他情况下,
sync
之前发布halt
并没有做任何有用的事情。这是一个记住你的训练的例子,而不是它背后的原因。在正常系统上,有后台作业,因此如果立即关闭系统sync;sync;sync;halt
就不会工作halt
。