有没有办法在进程写入文件时删除/截断文件?

ero*_*ppa 10 linux filesystems apache-2.2

我们有一个运行在 linux 上的 apache 服务器写入一个非常大的日志文件(access_log)。我们的服务器将开始耗尽空间。有没有办法在不重新启动服务器的情况下删除或截断文件(我们不希望有任何停机时间)。

小智 14

如何重置日志文件

迟早,您会想要重置您的日志文件(access_logerror_log),因为它们太大了,或者充满了您不需要的旧信息。

access_log 通常每 10,000 个请求增加 1Mb。

大多数人替换日志文件的第一次尝试只是移动日志文件或删除日志文件。这不起作用。

Apache 将继续以与移动日志文件之前相同的偏移量写入日志文件。这会导致创建一个与旧日志文件一样大的新日志文件,但它现在包含数千(或数百万)个空字符。

正确的过程是移动日志文件,然后向 Apache 发出信号告诉它重新打开日志文件。

Apache 使用SIGHUP (-1) 信号发出信号。例如

mv access_log access_log.old
kill -1 `cat httpd.pid` 

注意:httpd.pid是一个包含 Apache httpd 守护进程进程 ID 的文件,Apache 将其保存在与日志文件相同的目录中。

许多人使用这种方法每晚或每周更换(和备份)他们的日志文件。

http://httpd.apache.org/docs/1.3/misc/howto.html#logreset

  • “logrotated”呢? (3认同)

小智 9

日志轮换是长期解决方案,但对您当前问题的答案是截断文件,如下所示:

sudo cat /dev/null > /var/log/httpd/access_log
Run Code Online (Sandbox Code Playgroud)

我假设您没有以 root 身份登录并假设您的日志文件的位置,但您应该能够根据需要调整命令并快速截断打开的日志文件,而无需触及您正在运行的 apache 进程。

  • 至少在我的 ubuntu 12.04 上不起作用:`sudo` 适用于 `cat`,但不适用于文件重定向。我曾经使用`sudo truncate -s0 logfile`。 (4认同)
  • 不保证截断一定有效。如果进程以附加模式打开文件,它可能会起作用。如果文件不处于追加模式,则进程下次写入文件时,它将在当前偏移量处写入数据,这可能是截断之前文件的长度。因此,您可能会得到一个相同大小的文件,但所有预先存在的数据都被替换为“0”值字节(如果文件很大,则可能需要一些时间......)。如果幸运的话,底层文件系统支持稀疏文件,并且“0”字节不占用任何实际磁盘空间。 (2认同)

eww*_*ite 7

将日志文件归零...

# :>filename
Run Code Online (Sandbox Code Playgroud)

  • 根据提示,我会说他以 root 身份登录。 (2认同)

dre*_*cko 7

如果你想截断/归零一个你没有写访问权限的日志文件,你可以这样做

sudo truncate -s0 logfile
Run Code Online (Sandbox Code Playgroud)