Beim Schneiden von Nginx-Protokolldateien habe ich ein seltsames Problem entdeckt. Wenn ich die Nginx-Protokolldatei manuell an einen anderen Speicherort verschiebe und die Konfigurationsdatei nicht neu lade, schreibt Nginx weiterhin die Protokolldatei, die in ein anderes Verzeichnis verschoben wurde.
Verwendet Nginx beim Schreiben von Protokollen nicht den Dateipfad?
Warum kann die Protokolldatei nach dem Verschieben weiterhin beschrieben werden?
这是文件系统的特性,有点类似编程语言管理变量生命周期的里的引用计数。移动一个文件,甚至删除一个文件,只要这个文件还被某个进程打开着,这个文件就还能被访问到。但如果所有的“引用”都没有了,例如文件名,硬链接(hard link)及文件句柄(不再被程序打开着),才影响对文件的下一次引用,就表现为“找不到文件了”。
我觉得原因是,nginx打开的log文件之后,在系统中实际上是以inode来标识的,移动文件并不会修改inode的编号,所以还会继续写入该文件。
nginx为了更快的速度,一般都缓存了文件的inode的。