我正在尝试编写一个Unix脚本,当一个应用程序不断地写入/打开一个文件并占用3GB空间时,该脚本将截断/清空该文件。我知道下面的命令可以做到:
cp /dev/null [filename]
但我将以定时器方式在生产环境中自动运行此程序 - 我在这里发布,想知道您是否在执行类似操作时遇到任何问题。
只是为了补充另一个答案,
: > filename
:
在bash(符合POSIX标准)中是一个无操作命令,因此它本质上只是打开文件进行写入(当然会截断文件),然后立即关闭文件。编辑:如shellter所评论的,实际上您不需要使用重定向附带任何命令:
$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$
一个简单的重定向本身将清除文件。
echo "foo bar"
,而另一个进程截断该文件,则可能会有三个操作:write "foo "
、truncate
和 write "bar"
。(尽管这样一个小的写操作被拆分的几率很小,但不为零。然而,截断是保证作为一个单一、不可中断的操作完成的。) - chepner我在Debian上使用了以下命令
truncate -s 0 filename
sudo sh -c ': > filename'
也会截断filename
。 - Perleonesudo
一起使用:sudo cp /dev/null filename
。此外,cp
是可移植的,而truncate
仅适用于现代Linux系统。 - Tino我觉得这听起来很合理。当然,Unix会让你以大约50种不同的方式做到这一点。以下是两个例子:
echo -n "" >filename
cat /dev/null >filename
截取文件名 filename
适用于 UNIX 的 AIX 版本。
还有一种替代方案:
dd count=0 of=文件名
优势(主要适用于嵌入式系统):
logrotate
,它可能会为您提供一些价值(但设置可能会很烦人(只是猜测)!)。 - shellter