私は仕事の一部として他のいくつかのNodejs Live Serverを使用していますが、ツール/ワークフローに何らかのリークがあり、システムの制限に達するまで時間が経つにつれてファイルウォッチャーが蓄積されているようです。その後、次のcliエラーが発生します。
Error from chokidar (<path-to-folder>): Error:
ENOSPC: System limit for number of file watchers reached, watch '<path-to-folder>/<filename>'
次のコマンドは、使用されたワイルオブザーバーの数を返す必要があることを発見しました。
find /proc/*/fd -user "$USER" -lname anon_inode:inotify -printf '%hinfo/%f\n' 2>/dev/null | xargs cat | grep -c '^inotify'
すべてのライブサーバーがダウンしているようですが、515160を返します。 2つの質問があります。
- この問題をどのように診断しますか?登録されているすべてのオブザーバーのリスト、観察パス、対応するPIDなどの情報を取得できますか?
- その人々を皆殺す方法はないでしょうか。すべてのファイルウォッチャーを殺すのは良い考えですか?私のサーバーに登録されたオブザーバーを殺すだけですか?
私はDebian 11を使用しています。
答え1
指定したコマンドは、/proc
シンボリックリンクを持つファイル記述子を検索します。これらのプロセスのコマンドとPID、設定されたモニターの数を報告することも非常に簡単です。/proc/*/fd/
anon_inode:inotify
#!/bin/bash
cd /proc
for p in [0-9]*
do cd $p
if find fd -user "$USER" -lname anon_inode:inotify 2>/dev/null | grep -q .
then IFS= read -d '' cmd < cmdline
numwatch=$(cat fdinfo/* | grep -c '^inotify')
[[ $numwatch -ge 1 ]] && printf '%s\n PID %s\t %s watches\n' "$cmd" "$p" "$numwatch"
fi
cd ..
done
実際、オリゴプレンがすでに似たようなスクリプトを書いていることがわかりましたが、inotify - 消費者、ように 回答よりきれいな形式の出力があります。
しかし、観察している実際のパスを見つけることはより複雑。の inode のみなので、/proc/*/fdinfo
inode にマップされるパスを見つけるには、ファイルシステム全体を検索する必要があります。これは高価な作業です。
C ++プログラムがありますinotify - 情報これを行うことも発見されました。ここに答えがあります。私はちょうど私のコンピュータに構築したが動作します。引数なしで実行すると、inotify-consumersスクリプトと同様に、各プロセスのモニター数が単に一覧表示されます。特定のコマンド名またはPIDが与えられると、プロセスが監視するinodeのパスも検索します。
すべてのオブザーバーを殺すのは良い考えではないかもしれませんが、どのプロセスが多くのオブザーバーを使用しているかを確認したら、情報に基づいた選択をすることができます。