13

私は次のことをしました:

nohup find / &

rm nohup.out

奇妙なことに、 nohup コマンドは引き続き実行されました。新しいファイルが作成されるのを待ちました。驚いたことに、そのようなファイルはありませんでした。コマンドの stdout はどこに行きましたか?

4

4 に答える 4

12

UNIX でファイルを削除すると、次の 2 つのことが行われます。

  • そのディレクトリ エントリを削除します。
  • 開いているプロセスがなく、他のディレクトリエントリがそれを指していない場合 (ハードリンク)、スペースを解放します。

nohup されたプロセスは、以前は nohup.out と呼ばれていたファイルに喜んで書き込みを続けますが、現在はそのプロセス内のファイル記述子としてしか認識されていません。

別のプロセスで nohup.out を作成することもできますが、最初のプロセスに干渉することはありません。

すべてのハード リンクがなくなり、すべてのプロセスがそれを閉じると、ディスク容量が回復します。

于 2009-04-28T06:58:20.367 に答える
3

これは Unix の標準的な動作です。

ファイルを削除すると、ファイル システムの最後のリンクが削除されましたが、ファイルはまだ開いていたため、find(この場合) の出力はカーネル バッファー プールのディスク ブロックに書き込まれ、場合によってはディスクにも書き込まれました。しかし、ファイルには名前がありませんでした。終了時findに、プロセスまたはファイル (inode) がファイルを参照していなかったため、スペースが解放されました。これは、プログラムの終了時に消える一時ファイルを作成する 1 つの方法です。つまり、ファイルを開いてから削除します。(これは、ファイルの名前が必要ないことを前提としています。明らかに、一時ファイルの名前が必要な場合、この手法は機能しません。)

于 2009-04-28T06:58:47.713 に答える