Answers:
这是syslog中的错误,但说明了一个在程序打开时删除文件的常见问题。当您执行“ rm”时,您将删除目录条目,但不会删除基础文件。操作系统会保留对文件引用的计数,并且在引用计数变为零之前,实际上不会删除基础文件数据。对于普通文件,未打开文件的引用计数为1(目录条目)。打开文件后,计数增加到2。如果第二个程序打开同一文件,则计数将增加到三个。如果现在删除目录条目,则计数减为2-这意味着文件是无名的(没有名称),
当您删除/ var / log / mail时,系统记录器仍会打开该文件以供写入。如果创建一个新的/ var / log / mail,它将指向与系统记录器当前正在写入的文件不同的文件。使所有内容保持一致的唯一方法是重新启动系统记录器。当原始系统记录器终止时,与之关联的所有文件都将关闭-包括您删除了其目录条目的匿名邮件日志。当您重新启动系统记录器时,它将在需要写入日志消息时重新打开/ var / log / mail,并在此后保持打开状态。
经常发现的另一种方法是,正在运行的程序将文件数据填满整个磁盘。用户删除了非常大的文件,但由于该文件仍然存在并且正在占用磁盘空间,因此并未释放磁盘空间,但是目录项已被删除。当程序结束时(由于用户杀死了它或结束了它本身),磁盘空间将被恢复,因为文件上的引用计数将变为零。
记录程序可能采取的措施是,首先编写日志消息,检查日志文件目录条目是否存在,如果不存在,请关闭原始日志文件,打开一个新的日志文件,然后重写消息-这样消息就不会丢失。但是,要执行所有这些操作,将需要比系统记录器本应具有的复杂性高得多-因为额外的目录检查,因此写入的每条消息都将花费更长的时间才能写入-每次文件包含未删除。
为了更清楚地理解上述所有内容,以下命令具有指导意义,因为它描述了执行目录条目删除和引用递减的系统调用:“ man 3 unlink”