确定Linux中文件句柄的文件路径

时间:2011-10-20 18:29:35

标签: php linux

我有一个守护进程打开一个文件并在整个操作过程中写入(通常一次多天)。为了支持日志轮换,我希望能够识别句柄引用的文件何时位于原始文件的新位置。

这可能吗? fstat()没有给我任何有用的东西。

我目前的解决方案是,在日志写入功能中,测试日志文件是否存在,如果不存在,则关闭旧句柄并打开新句柄。这是有效的,但是是一个黑客并且有局限性。就我而言,我们的系统组使用一个日志轮换工具,要求他们在旋转文件后触摸该文件,这会导致我的守护进程继续认为其文件句柄指向正确的位置。

3 个答案:

答案 0 :(得分:3)

这是一个想法。它不便携,我不完全确定它是否有效或可靠,它让我有点畏缩,但你可以在/proc/%d/fd/%d使用readlink,其中第一个%dgetpid()的结果,第二个是您的文件描述符。

但这里有一些警告。首先,整个“获取路径+用该路径做某事”的方法将面临同时发生重命名的竞争条件。此外,您的日志文件可能有其他链接。我不确定/proc中的链接在重命名时的行为是什么。

答案 1 :(得分:0)

您可以定期重新获取文件句柄(使用模式a),例如每24小时一次。这允许您继续记录,尽管存在moronic和buggy(因为在重命名文件和重新触摸它之间存在不可避免的竞争条件)日志旋转实用程序。

答案 2 :(得分:0)

fstat会为您提供一个inode编号,该编号会在日志轮换时更改。

请参阅http://php.net/manual/en/function.fstat.phphttp://www.php.net/manual/en/function.lstat.php

您可以将fstat的inode编号与lstat的inode编号进行比较;如果它们不同,请重新打开。

过去,为Unix守护程序处理此问题的标准方法是捕获SIGHUP并将其用作重新打开日志文件的信号,并使日志轮换脚本发送SIGHUP。 / p>