tail -f catalina.out
を実行しようとすると、次のエラーが表示されます。
tail: inotify cannot be used, reverting to polling: Too many open files
私はこの投稿で答えを試しました: 開いているファイルが多すぎる-犯人を見つける方法
lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
上記のコマンドを実行すると、出力は
17 6115
13 6413
10 6417
10 6415
9 6418
9 6416
9 6414
8 6419
4 9
4 8
1024個のファイルを開いているプロセスはありません。開いているファイルの数は17,13,10,10,9ではありませんか?または私はそれを間違って理解していますか?そして、これらはすべてbash、sshd、Apache2、Tomcatは4番でした。
lsof | grep tail | wc -l
を返した20
も行いました。これらの数値はそれほど大きくないのに、なぜtail -f catalina.out
が失敗するのですか?
これは http://peter-butkovic.blogspot.com/2013/08/tail-inotify-resources-exhausted.html の指示に従うことで解決しました
永続的なソリューション(再起動後も保持される)行の追加:
fs.inotify.max_user_watches=1048576
に:
/etc/sysctl.conf
制限値を恒久的に修正しました(再起動間でも)。
それから
sysctl -p
その答え は完全ではないと思います(システムで開いているファイルの最大制限については何も言っていません)。
開いているファイルの最大数に関して2つの制限があります。
プロセスごとに開くことができるファイルの最大制限/プロセス.
ulimit -n
ulimit -n new_limit_number
を使用して変更できます以下は、多くのファイルを開いている上位10プロセスを取得するコマンドです。
lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
システムごとのオープンファイルの最大制限。
cat /proc/sys/fs/file-max
echo new_limit_number > /proc/sys/fs/file-max
を使用して変更できますlsof | wc -l
ほとんどの場合、inotify
ウォッチを使い果たしました。おそらく、いくつかのファイル同期ツール(Dropboxなど)をバックグラウンドで実行していますか?
Linuxでは、tail -f
コマンドの内部実装はデフォルトでinotify
メカニズムを使用して、ファイルの変更を監視します。すべてのinotify
ウォッチ(デフォルトでは8192)を使い果たした場合、inotify -f
はポーリングに切り替えて、そのファイルへの変更を検出する必要があります。
もちろん、inotify
ウォッチの最大数を変更できます。
参照:
http://www.quora.com/How-is-tail-f-implemented
http://peter-butkovic.blogspot.com/2013/08/tail-inotify-resources-exhausted.html
https://serverfault.com/questions/510708/tail-inotify-cannot-be-used-reverting-to-polling-too-many-open-files
sysctl fs.inotify.max_user_instances
は、inotify
に対してユーザーごとに制限を取得します。
私はそれを経験し、システム全体の制限はすべて十分に高かったが、ユーザーによる設定は通常デフォルトで比較的低く、sysctl.conf
で増やして、sysctl -p
でリロードできます。
走る
ps aux | grep tail
crontabによる生成など、実行中のテールコマンドが多すぎるかどうかを確認します。
カーネルのバージョンを確認してください。このバグの可能性があります。
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1101666