好的,我正在尝试清空一个文件。这是一个文本日志文件,正在连续写入。我的 ls -lh 显示它有 3GB
我跑
> file.log
我的 ls -lh 显示它仍然是 3GB
但是包含此文件的文件夹大小少了 3GB。奇怪的是,数了数行数,发现它不是空的,而且我无法用 vim 打开它(太大了)。
我没有管理员权限,但我是该文件的所有者。
我尝试创建一个只有第一行的新文件来查看发生了什么
head -1 file.log > first_line.txt
而且 first_line.txt 的大小是 3GB。这确实是一个奇怪的行为。
问题1:为什么我的第一个命令没有清空文件?
问题2:如何清空该文件而不删除它?
谢谢,
评论后编辑:该文件正在被其他进程连续打开和写入。
遗憾的是我无法干扰这些进程,所以我无法暂时退出或重新启动它们
答案1
您的文件正在被一个进程持有,您无法删除它。
用于lsof file.log
了解哪个进程正在写入它。
然后
mv file.log old.file.log
重新启动该进程。(这取决于进程)。
接下来,您将能够删除old.file.log
。
如果您的文件 ID 列出,/etc/logrotate.d/*
您可以发出 logrotate 命令。
答案2
要(几乎)清空文件,请使用命令
echo "" > file.log
或者,如果你的操作系统有它,
truncate file.log --size 0
将会将其截断为 0 字节。
如果文件没有任何换行符,则整个文件可能只有 1 行长,这解释了 3GB 的文件。
您可以使用以下命令获取文件样本
dd if=file.log of=firstpart.txt count=1 bs=200
这将占用文件的前 200 个字节。(如果需要更多,请将“bs”参数增加到 4096,如果需要更多,请使用 count 参数,即获取 8192 个块,count=2 bs=4096)
@Archemar 的建议很好,但我不确定它是否能回答你的问题。