truncate -s 0 file.log 是清空正在写入的日志文件最安全的方式,它仅修改 st_size 字段,保留 inode、权限、ACL 和已打开的文件描述符,进程无感知;其他方式如 > file.log 或 rm && touch 会导致 inode 变更、SELinux 上下文丢失或服务异常。

truncate -s 0 清空日志文件最安全
直接用 > file.log 或 echo "" > file.log 清空正在被进程写入的日志,会导致 inode 变更、mtime 重置、SELinux 上下文丢失,还可能触发 inotify 事件让服务异常。用 truncate -s 0 file.log 才是正解——它只改 st_size 字段,保留 inode、权限、ACL、打开的 fd,进程继续写入完全无感知。
常见错误:
-
rm file.log && touch file.log:进程发现文件消失,可能报错或拒绝重建写入句柄 - 忘记检查文件是否被锁定:
chattr +a(仅追加)或chattr +i(不可变)会拒绝truncate,需先执行chattr -a -i file.log - NFS 挂载点上对只读文件系统执行会失败,不是静默跳过,而是报
Operation not permitted
扩展或缩小文件时注意单位与符号
truncate -s 后面的值支持多种单位和偏移写法,但顺序和符号容易出错:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
-s 100M:设为 100 × 1024² 字节(MiB),不是 100 × 1000² -
-s +50K:在当前大小基础上增加 50 × 1024 字节;-s -100:减少 100 字节 -
-s /4096:向下舍入到最接近的 4096 字节边界(即 block 对齐),适合日志或镜像对齐场景 - 错误写法:
truncate -s 1G file中空格不能省(-s1G会被解析为选项-s1和参数G file,报错)
用 -r reference.file 同步一批文件大小
当需要让多个配置文件、stub 文件或模板统一大小(比如都对齐到 4KB),truncate -r 比逐个 stat + truncate -s 更可靠简洁:
-
truncate -r /etc/passwd *.conf:把所有.conf文件大小设为和/etc/passwd完全一致(只读 st_size,不校验类型或权限) -
truncate -r /dev/zero -s 1K empty.stub:注意-r必须在-s前,否则被忽略;这里创建一个逻辑大小 1KB 的稀疏空文件 - reference 文件若不存在或不可读,命令直接失败,不会 fallback,建议加
test -r reference.file && truncate -r reference.file target做前置判断
ftruncate() 比 truncate(1) 更适合程序内调用
命令行 truncate 每次都要 fork + exec + open + ftruncate + close,开销不小;C 程序里直接调用 ftruncate() 复用已有 fd,更高效也更可控:
-
ftruncate(fd, 1024)要求 fd 已用O_RDWR打开,且不能是只读 fd -
truncate("path", size)不依赖打开状态,但每次都要路径解析和权限检查 - 截断后文件偏移量(offset)不会自动归零,如果后续要
write(),记得用lseek(fd, 0, SEEK_SET)重置位置,否则可能写到末尾之外 - 扩展文件时填充的是 \0 字节,但实际磁盘不立即分配空间(稀疏文件),
du -h显示远小于ls -l,备份工具可能误判为空

















