저는 업무의 일부로 몇 가지 다른 Nodejs 라이브 서버를 사용하고 있는데 도구/워크플로에 일종의 누출이 있어 시스템 제한에 도달할 때까지 시간이 지남에 따라 파일 감시자가 누적되는 것 같습니다. 그런 다음 다음 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을 반환합니다. 두 가지 질문이 있습니다.
- 이 문제를 어떻게 진단합니까? 등록된 모든 관찰자 목록, 관찰 경로, 해당 PID 또는 유사한 정보를 얻을 수 있나요?
- 그 사람들을 모두 죽일 수 있는 방법은 없을까요? 모든 파일 감시자를 죽이는 것이 좋은 생각입니까? 내 서버에 등록된 관찰자를 그냥 죽일 수 있나요?
저는 데비안 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의 경로도 검색합니다.
모든 관찰자를 죽이는 것은 좋은 생각이 아닐 수도 있지만 어떤 프로세스가 많은 관찰자를 사용하고 있는지 확인한 후에는 정보에 입각한 선택을 할 수 있습니다.