web-dev-qa-db-ja.com

使用中のinotify時計の数を取得する方法

ファイルを置くイベントトリガーにinotifywaitを使用します。

inotifywaitが多くのファイルを監視しているとき、max_user_watchesを超えると、次のエラーが発生します。

Inotifyウォッチが終了してから終了します。#012/proc/sys/fs/inotify/max_user_watchesの増加を検討してください。

チューニングが必要です/proc/sys/fs/inotify/max_user_watches、しかし、現在のファイル監視番号を確認することは可能ですか?

ファイル記述子でfile-nrのようにチェックする方法はありますか?

5
Soushi Hiruta

私は一緒に石畳を作りました この小さなスクリプト @mosvyの答えに基づいています。

$ inotify-consumers 

   INOTIFY
   WATCHER
    COUNT     PID     CMD
----------------------------------------
    7111     3079  node /home/carlerik/dev/nimble-frontend/node_modules/.bin/webpack --config config/webpack.dev.js
      79     1541  /usr/lib/gnome-settings-daemon/gsd-xsettings
      30     1664  /usr/lib/gvfs/gvfsd-trash --spawner :1.22 /org/gtk/gvfs/exec_spaw/0
      14     1630  /usr/bin/gnome-software --gapplication-service
      14     1191  /lib/systemd/systemd --user
      10     1371  /usr/bin/gnome-Shell
       9     2459  update-notifier
       7     1635  nautilus-desktop
       5     1191  /lib/systemd/systemd --user
       2     1536  /usr/lib/gnome-settings-daemon/gsd-sound
       2     1452  /usr/lib/evolution/evolution-source-registry
       2     1429  ibus-daemon --xim --panel disable
       2     1248  /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
       1     1863  /usr/lib/gnome-terminal/gnome-terminal-server
       1     1713  /usr/lib/evolution/evolution-addressbook-factory
       1     1678  /usr/lib/ibus/ibus-engine-simple
       1     1625  /usr/lib/evolution/evolution-calendar-factory
       1     1560  /usr/lib/gnome-settings-daemon/gsd-Housekeeping
       1     1556  /usr/lib/gnome-settings-daemon/gsd-color
       1     1499  /usr/lib/gvfs/gvfs-afc-volume-monitor
       1     1487  /usr/lib/gnome-online-accounts/goa-identity-service
       1     1480  /usr/lib/gvfs/gvfs-udisks2-volume-monitor
       1     1460  /usr/lib/gnome-online-accounts/goa-daemon
       1     1440  /usr/lib/ibus/ibus-portal
       1     1435  /usr/lib/ibus/ibus-x11 --kill-daemon
       1     1433  /usr/lib/ibus/ibus-dconf
       1     1410  /usr/bin/pulseaudio --start --log-target=syslog
       1     1410  /usr/bin/pulseaudio --start --log-target=syslog
       1     1410  /usr/bin/pulseaudio --start --log-target=syslog
       1     1371  /usr/bin/gnome-Shell
       1     1352  /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
       1     1254  /usr/lib/gnome-session/gnome-session-binary --session=ubuntu
       1     1254  /usr/lib/gnome-session/gnome-session-binary --session=ubuntu
       1    12287  /home/carlerik/.sdkman/candidates/Java/current/bin/Java -classpath /usr/share/maven/boot/plexus-classworlds-2.x.jar -Dcl
       1     1191  /lib/systemd/systemd --user
9
oligofren

もっと賢く答えられたらいいのですが、ユーザーが設定したinotify(7)ウォッチを数える唯一の方法は次のとおりです。

_find /proc/*/fd -user "$USER" -lname anon_inode:inotify \
   -printf '%hinfo/%f\n' 2>/dev/null |
   xargs cat | grep -c '^inotify'
_

_"$USER"_を、情報が必要な実際のユーザーに変更します。現在のユーザーの_"`id -u`"_。 _max_user_watches_はユーザーごとの制限であり、プロセスごと、またはinotifyインスタンス/ファイル記述子ごとではないことに注意してください。

これは最初にinotify_init*(2)によって作成されたすべてのオープンファイル記述子をfindし、次に対応する_/proc/PID/fdinfo/FD_ファイルを調べて、inotify_add_watch(2)で追加されたウォッチ記述子に関する情報を探します。それぞれに(inotify固有のエントリの説明については、_/proc/[pid]/fdinfo/_の下にある proc(5) のマンページを参照してください)。 grepの_-c_オプションを使用すると、パターンに一致するすべての行の数を出力できます。

注:_inotify_watches_のカウンターは、ユーザー名前空間構造から参照される_struct ucounts_の他のユーザーごとのカウンターと同じように保持されます-参照 _include/linux/user_namespace.h_ ;しかし、これらのカウンターをユーザーランドに公開するインターフェイスを見つけることができませんでした。

7
mosvy