Wie kann lsof mehr offene Dateien melden, als laut ulimit das Limit ist?
prod_web3(i-ca0b05aa):~$ sudo lsof | wc -l
4399
prod_web3(i-ca0b05aa):~$ ulimit -n
1024
Wie kann lsof mehr offene Dateien melden, als laut ulimit das Limit ist?
prod_web3(i-ca0b05aa):~$ sudo lsof | wc -l
4399
prod_web3(i-ca0b05aa):~$ ulimit -n
1024
Antworten:
Aus der ulimit builtins Manpage
The ulimit builtin provides control over the resources available to the shell
and to processes started by it on systems that allow such control.
Ihr lsof
Befehl listet alle geöffneten Dateien für alle Prozesse für alle Benutzer im System auf. Sie vergleichen nicht wie mit wie.
Dies ist ein häufiger Fehler beim Vergleich der Ergebnisse eines Rohanrufs lsof
mit dem angenommenen Limit.
Für das globale Limit ( /proc/sys/fs/file-max
) sollten Sie sich /proc/sys/fs/file-nr
-> ansehen. Der erste Wert gibt an, was verwendet wird, und der letzte Wert ist das Limit
Das OpenFile-Limit gilt für jeden Prozess, ist jedoch für einen Benutzer definiert. Siehe Befehl ulimit -Hn
für Benutzerlimits und /etc/security/limits.conf
Definitionen. Wird im Allgemeinen mit "App-Benutzer" angewendet, z. B.: "Tomcat": Setzen Sie das Limit für Benutzer Tomcat auf 65000, das für den ausgeführten Java-Prozess gilt.
Wenn Sie das auf einen Prozess angewendete Limit überprüfen möchten, rufen Sie die PID ab und gehen cat /proc/${PID}/limits
Sie wie folgt vor: Wenn Sie überprüfen möchten, wie viele Dateien von einem Prozess geöffnet werden, rufen Sie die PID ab und dann od: ls -1 /proc/{PID}/fd | wc -l
(Hinweis: Für ls ist es 'minus eins', nicht mit 'minus el' zu verwechseln)
Wenn Sie Details wissen möchten, lsof
aber nur für diejenigen Dateihandler, die für das Limit zählen, versuchen Sie es mit diesen Befehlen:
lsof -p ${PID} | grep -P "^(\w+\s+){3}\d+\D+"
lsof -p ${PID} -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -a
Anmerkung: Die 'Dateien' sind Dateien / Pipe / TCP-Verbindungen / etc.
Beachten Sie, dass Sie manchmal wahrscheinlich root sein oder verwenden müssen sudo
, um das richtige Ergebnis für die Befehle zu erhalten. Ohne Privileg haben Sie manchmal keinen Fehler, nur weniger Ergebnisse.
Wenn Sie wissen möchten, auf welche 'Dateien' in Ihrem Dateisystem von einem Prozess zugegriffen wird, schauen Sie sich Folgendes an: lsof -p {PID} | grep / | awk '{print $9}' | sort | uniq
habe Spaß !
Obwohl dies alt ist, wollte ich die gleiche Frage stellen ... die Antwort ist in meinem Fall nicht zufriedenstellend, da dies passiert:
$ sudo su tomcat -c "ulimit -n"
1024
$ lsof -u tomcat
3967
Ich bin mir nicht ganz sicher, warum das passiert ist. Ich vermute, dass offene Dateien aus dem Unterprozess im übergeordneten nicht berücksichtigt werden.
ulimit
gilt pro Prozess und nicht pro Benutzer. Wenn Sie die Anzahl der geöffneten Dateihandles für einen bestimmten Prozess überprüfen möchten, verwenden Sielsof -p $pid