一个进程继续写在solaris上重命名文件

有一个java进程会logging到某个文件,例如err.log 。 我重新命名了它(没有重启java进程),例如“ mv err.log err.log0 ”,然后看到java进程继续logging到err.log0

为什么是这个,它背后的逻辑是什么? 所有unix / Linux平台都很常见吗?

该进程将在启动时打开它的日志文件,并保持打开状态。 它将使用文件打开时创build的文件描述符写入文件。 文件的名称与文件描述符打开后没有任何关系,因此更改名称不会影响写入该文件的进程。 这是正常的和预期的。

如果你想要你的进程打开一个新的日志文件,那么它将被写入接受一个信号告诉它closures旧文件并打开一个新的。

为了补充一点,你可以真正打开没有文件名的文件。 假设你删除了那个文件,进程将继续写入它,并且它将继续占用磁盘空间。 当它closures时,它将被删除。 您也可以使用“ln”命令创build多个文件名来访问相同的文件。 打开并立即删除文件的目录条目是确保临时文件的空间在stream程退出时即使发生崩溃时也被释放的常用方法。 “ls”的“-i”选项将包含inode编号,以便您可以确定哪些文件名将转到同一个文件。

以防万一你要做的是旋转日志文件,而不重新启动Java进程,这是一种应该工作的方式:

cp err.log err.log0 cat /dev/null > err.log 

这实际上复制日志,然后截断它(将其大小设置为零),所以你需要额外的磁盘空间,但应用程序应该继续日志logging到err.log。