重命名文件linux时更改描述符

重命名文件linux时更改描述符

我在 CentOS 中有一个程序,它将其日志写入文件。当我重命名它时,程序仍然会写入它。有没有办法在不重新启动程序的情况下更改该文件描述符?

答案1

尽管我已重命名文件,但该过程仍会以某种方式写入文件。

这就是所谓的操作系统正常运行一旦文件被打开,对于使用打开文件描述符的进程来说,文件的名称是什么,甚至文件是否有名称都不再重要。

简而言之,你的程序的日志记录方案(如果确实如此)是不成熟的。你正在经历的正是为什么这是幼稚的。只要生成日志的程序继续运行,这个文件就会永远增长,直到它耗尽了运行它的用户可用的所有磁盘空间。(如果您的程序以超级用户身份运行,上帝会帮助您。)如果取消链接文件,程序会继续无限期地占用磁盘空间,因为文件继续存在于磁盘上而没有名称,直到其最后一个打开的文件描述符被关闭。并且不可能从程序本身之外旋转日志文件或重置打开的文件描述符的文件位置。因此,即使截断也不起作用,因为程序会继续从其最后一个位置写入,因为这个人发现

现在,除非附加调试器,否则在程序结束之前您什么也做不了。下次,如果可能的话,告诉您的程序记录到其标准错误或标准输出。然后通过管道将该标准错误/标准输出发送到程序,例如multilogmultilogs6-logsvlogdtinylog, 或者cyclog. 您将获得一组大小受限、自动循环、可按需旋转的日志文件。

下次,一个较差的做法是以附加模式打开文件。您将不得不费力地复制和截断日志,因为通过重命名文件进行轮换仍然行不通;当然,正如手册页所说,这有可能丢失日志数据,logrotate因为在复制和截断文件之间存在机会窗口。相比之下,上述日志记录工具不会因为或之类的日志轮换而在不可预测的时间点丢失日志数据(newsyslog不需要logrotate也不会使用)。将它们与保持管道打开的进程管理器结合使用,即使重新配置并重新启动记录器,它们也不会丢失日志数据。

相关内容