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

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

我们有一个在 Linux 上运行的 Apache 服务器,它正在向一个越来越大的日志文件 (access_log) 写入数据。我们的服务器将开始耗尽空间。有没有办法在不重新启动服务器的情况下删除或截断文件(我们不希望有任何停机时间)。

答案1

如何重置日志文件

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

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

大多数人第一次尝试替换日志文件时,只是移动日志文件或删除日志文件。这是行不通的。

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

正确的步骤是移动日志文件,然后向 Apache 发出信号,让它重新打开日志文件。

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

mv 访问日志 访问日志.old
kill -1 `cat httpd.pid`

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

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

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

答案2

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

sudo cat /dev/null > /var/log/httpd/access_log

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

答案3

将日志文件清零...

# :>filename

答案4

尝试使用logrotate

  • 它是一个强大的工具,为旋转日志提供了可配置的选项。
  • 它还具有在期间运行命令的prerotate功能postrotate
  • copytruncate可让您复制现有文件,然后将其截断。如果需要,可以将副本移至其他存储(如 hadoop、s3)进行备份
  • 此外,还可以设置 cron,例如/usr/sbin/logrotate --force /etc/logrotate.hourly.conf 2>&1 >> /tmp/logger使用/etc/cron.hourly/logrotate

更多信息man logrotate

相关内容