现代 Linux 发行版关机时默认调用 sync,日常无需手动执行;但在高负载、大文件写入后、嵌入式设备或内核写回线程异常时,手动执行 sync(甚至三次)可增强数据安全性。

关机前要不要手动执行 sync?
现代 Linux 发行版在执行 shutdown、reboot 或 poweroff 时,关机脚本默认会调用 sync,所以日常关机不用额外操作。但如果你遇到以下情况,手动加一次 sync 是值得的:
– 系统负载极高,I/O 响应迟缓
– 刚完成大文件写入(如数据库 dump、日志归档)
– 运行在嵌入式设备或无 UPS 的边缘节点上
– 怀疑内核线程 bdflush 或 writeback 已卡住
sync 命令本身没参数,但执行时机很关键
sync 不接受路径、不支持过滤、也不分文件系统——它强制刷**所有已挂载文件系统**的缓冲区。这意味着:
– 它会等待所有 pending 写操作完成才返回,期间 shell 会卡住几秒到几十秒(尤其在机械盘或高负载下)
– 单次执行不一定彻底:某些内核版本或存储栈(如 dm-crypt + LVM)可能残留少量 dirty page,连续执行三次更稳妥
– 不要把它和 echo 3 > /proc/sys/vm/drop_caches 混用,后者清的是 page cache(读缓存),和 sync 解决的 write buffer(写缓冲)不是一回事
怎么安全地把它塞进关机流程里
最直接的方式是串行执行:
– sync && sudo shutdown -h now
– 或更保守一点:sync; sync; sync && sudo shutdown -h now
注意:
– 不要用 & 后台运行 sync,否则关机可能在同步完成前就触发
– 如果你在写自动化脚本(比如定时备份后关机),务必在 sync 后检查退出码:sync || echo "sync failed, aborting shutdown"
– 在 systemd 系统中,不要试图覆盖 shutdown.target,那是过度设计;临时性保障,命令行串起来就行
哪些场景下 sync 实际无效?
sync 只能保证“已提交到 VFS 层”的数据落盘,对以下情况无能为力:
– 应用层未调用 fsync() 或 fflush()(比如某些日志库用 buffered write)
– 存储设备开启 write-back cache 且未启用 hdparm -W1 或 NVMe 的 nvme set-feature -f 0x05 -v 1
– 文件系统挂载时用了 noatime,nobarrier 等激进选项
换句话说:sync 是最后一道软件层防线,但它不能替代应用层持久化逻辑,也不能绕过硬件缓存策略


















