7

次の Node プログラムがあるとします。これは、"Ping!" を実行するマシンです。

var machine = require('fs').createWriteStream('machine.log', {
    flags    : 'a',
    encoding : 'utf8',
    mode     : 0644
});

setInterval(function () {
    var message = 'Ping!';
    console.log(message);
    machine.write(message + '\n');
}, 1000);

毎秒、コンソールにメッセージを出力し、ログ ファイル (必要に応じて起動時に作成されます) に追加します。それはすべてうまくいきます。

しかし、プロセスの実行中にファイルを削除すると、machine.logファイルは引き続きうまく動作しますが、ファイルがなくなるため、書き込みは成功しなくなります。しかし、書き込みは黙って失敗しているように見えます。つまり、この状態を明示的に確認する必要があります。Stream ドキュメントを検索しましたが、この種のことが発生したときに発生する明白なイベントが見つからないようです。の戻り値write()も役に立ちません。

書き込んでいるファイルが削除されたことを検出して、ファイルを再度開いたり再作成したりするにはどうすればよいですか? 関連する場合、これはCentOSボックスです。

4

1 に答える 1

8

書き込みは実際には失敗しません。

別のプログラムで開いているファイルを削除すると、そのファイルの inode への名前付きリンクが削除されます。それを開いているプログラムは、まだその i ノードを指しています。喜んで書き込みを続け、実際にディスクに書き込みます。名前付き参照を削除したため、これを見る方法がありません。(ハードリンクなどの他の参照があった場合でも、それは可能です!)。

そのため、ログ ファイルが「消える」ことを期待するプログラム (logrotateたとえば、b/c) は通常、ファイルを閉じるように指示するシグナル (通常はSIGHUP、場合によってSIGUSR1は) をサポートします (その時点で、ログ ファイルは実際にはなくなっています。任意の場所へのリンク)、再作成します。

そのようなことも考慮する必要があります。

于 2013-10-10T19:12:02.200 に答える