【问题标题】:Removal of the nohup -file during the execution在执行期间删除 nohup 文件
【发布时间】:2010-10-22 05:52:52
【问题描述】:

我做了以下事情:

nohup find / &

rm nohup.out

奇怪的是,nohup 命令继续运行。我等待创建一个新文件。令我惊讶的是,没有这样的文件。命令的stdout去哪了?

【问题讨论】:

    标签: nohup


    【解决方案1】:

    在 UNIX 中删除文件有两件事:

    • 它会删除它的目录条目。
    • 如果没有进程打开它并且没有其他目录条目指向它(硬链接),它会释放空间。

    您的 nohupped 进程将很乐意继续写入以前称为 nohup.out 的文件,但现在在该进程中只知道一个文件描述符。

    你甚至可以让另一个进程创建一个 nohup.out,它不会干扰第一个。

    当所有的硬链接都没有了,所有的进程都关闭了它,磁盘空间就会被回收。

    【讨论】:

    • 如果可以将inode的位置更改为/dev/null,我认为可以将其更改为其他位置。假设我希望每 5 秒从 find -command 到不同位置的标准输出。我知道我可以在每个步骤中创建一个新的硬链接,始终删除最后一个链接。但是,我无法理解这个过程。如何确保每 5 秒的标准输出有一个不同的 inode 编号?如何确保异步过程,确保记录所有内容?
    • 第一句话令人困惑,@SQ,我认为您不了解 inode 是什么 - 它实际上只是底层文件的 ID(数据,而不是目录条目)。改成/dev/null,意思是“找/>/dev/null”吗? find 只是输出到它从 shell 继承的文件描述符。使用重定向,shell 将 stdout 附加到文件(或设备驱动程序,例如 /dev/null),然后 fork/execs 查找将使用该 stdout 描述符的文件。 find 本身不知道它正在写入什么文件,只是一个描述符。所以它不会重新创建目录条目,因为它的文件仍然存在。
    • @SimpleQuestions:很少有程序在每次写入时都会打开文件,尤其是在写入标准输出时。他们只是继续使用打开的文件描述符。一旦您的程序开始写入给定文件,它就会继续这样做。您无法通过(重新)移动文件来更改它写入的文件。
    • 嘿,我就是这么说的,只有你的用可以理解的英语:-)
    • 以后如果你想在进程写入时截断日志文件,请使用以下命令:cat /dev/null > nohup.out
    【解决方案2】:

    如果您要删除 nohup.out 文件,句柄将丢失,它只会写入文件描述符,但如果您想清除 nohup.out 文件,则只需运行此文件

    true > nohup.out
    

    它会删除文件的内容,但不会删除文件。

    【讨论】:

    • 有效,但是当应用程序写入更多数据时,我只看到十六进制数字:0000 0000 0000 0000 0000 0000 0000 0000,最后一些数字不同于 0
    • 不应该。很可能 nohup 文件已损坏。你能告诉我你是如何启动 nohup 命令的吗?
    • 当然! "java -jar MyApp.jar > nohup.out 2>&1 &"
    【解决方案3】:

    这是 Unix 上的标准行为。

    当您删除文件时,文件系统中的最后一个链接已删除,但文件仍处于打开状态,因此find(在这种情况下)的输出被写入内核缓冲池中的磁盘块,并且甚至可能写入磁盘。但该文件没有名称。当find退出时,没有进程或文件(inode)引用该文件,所以空间被释放。这是创建程序退出时将消失的临时文件的一种方法 - 通过打开文件然后将其删除。 (这假定您不需要文件的名称;显然,如果您需要临时文件的名称,则此技术将不起作用。)

    【讨论】:

    • 随着 rm 命令删除最后一个链接,数据仍然在磁盘上,除非它没有被覆盖。在不知道最后一个链接的情况下找到数据的概率是多少?
    • 概率为零 - 除非你去戳原始设备。该文件已用完空间(df 将其报告为“正在使用”)。但是,没有可以访问它的名称。理论上,原始过程可以读取数据(也可以写入);当然,find 不会那样做。
    【解决方案4】:
    cat /dev/null > nohup.out
    

    来自here

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多