tail: no se puede usar inotify, volviendo a sondeo: demasiados archivos abiertos

16

Cuando lo intento tail -f catalina.out, aparece el error:

tail: inotify cannot be used, reverting to polling: Too many open files 

Intenté la respuesta en esta publicación: Demasiados archivos abiertos: cómo encontrar al culpable

lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head

Cuando ejecuté el comando anterior, la salida fue

17 6115

13 6413

10 6417

10 6415

9 6418

9 6416

9 6414

8 6419

4 9 

4 8

No veo ningún proceso con 1024 archivos abiertos. ¿No está abierto el número de archivos 17,13,10,10,9? ¿O lo estoy entendiendo mal? Y todos estos eran bash, sshd, apache2, tomcat tenía el número 4.

También hice lo lsof | grep tail | wc -l que regresó 20. Estos números no son enormes, entonces, ¿por qué tail -f catalina.outfalla?

gbag
fuente

Respuestas:

17

Esto se resolvió para mí siguiendo las instrucciones en http://peter-butkovic.blogspot.com/2013/08/tail-inotify-resources-exhausted.html

Solución permanente (preservada en los reinicios) Agregar línea:

fs.inotify.max_user_watches=1048576

a:

/etc/sysctl.conf

Se corrigió el valor límite de forma permanente (incluso entre reinicios).

entonces haz un

sysctl -p
Elan Hasson
fuente
1
Aumentar los descriptores de archivos no me ayuda. Mi tailmensaje era ligeramente diferente: tail: inotify resources exhausted. Esta respuesta me ayudó. También puede usar sudo sysctl -w fs.inotify.max_user_watches=1048576 && sysctl -ppara probar si ayuda sin modificarlo permanentemente. Esta publicación también ayuda a nefaria.com/2014/08/tail-inotify-resources-exhausted
Ruslan Stelmachenko
9

Creo que la respuesta no está completa (no dice nada sobre el límite máximo de archivos abiertos en el sistema).

Hay dos límites con respecto al número máximo de archivos abiertos:

  1. Límite máximo de archivos abiertos por proceso .

    • Puede ver cuál es el valor de este límite usando: ulimit -n
    • Puede cambiar este límite usando: ulimit -n new_limit_number
    • Aquí hay un comando para obtener los 10 procesos principales que tienen muchos archivos abiertos:

      lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
  2. Límite máximo de archivos abiertos por sistema .

    • Puede ver cuál es el valor de este límite usando: cat /proc/sys/fs/file-max
    • Puede cambiar este límite usando: echo new_limit_number > /proc/sys/fs/file-max
    • Cuente todos los identificadores de archivos abiertos: lsof | wc -l
Radu Rădeanu
fuente
6

Lo más probable es que te hayas quedado sin tus inotifyrelojes. Probablemente, ¿está ejecutando algunas herramientas de sincronización de archivos (por ejemplo, Dropbox) en segundo plano?

En Linux, la implementación interna del tail -fcomando usa el inotifymecanismo de manera predeterminada, para monitorear los cambios de archivos. Si te has quedado sin todos los inotifyrelojes (8192 por defecto), entonces inotify -ftienes que cambiar a sondeo para detectar cambios en ese archivo.

Por supuesto, puede modificar el número máximo de inotifyrelojes.

referencia:
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

zeekvfu
fuente
3

sysctl fs.inotify.max_user_instancesobtendría límite por usuario para inotify.

Lo experimenté, y todos los límites del sistema eran lo suficientemente altos, pero la configuración por usuario suele ser relativamente baja por defecto, puede aumentarlo sysctl.confy volver a cargarlo sysctl -p.

JBat
fuente
3

correr

ps aux | grep tail

para verificar si se están ejecutando demasiados comandos de cola, como una generación de crontab.

tangxinfa
fuente
ja esto realmente funcionó, siguiendo demasiados archivos
Alexander Mills
¿Cómo traduzco los datos? ¿Puede explicar qué significa cada pieza de información y qué hacer al respecto? Por ejemplo:root 20161 0.0 0.0 11132 1044 pts/0 S+ 17:27 0:00 grep tail
Christia
Es un problema solo si DEMASIADOS procesos coinciden, la línea que coincide contiene "grep" es generada por el comando mismo. Utilice el comando "cola pgrep" en su lugar.
tangxinfa