Pendant quelque temps, j'ai l'erreur suivante:
Error: EMFILE, too many open files '/Users/blagus/Gallery/Websites/Nicsware/Pills/resources/core/auth.node.js'
at Object.fs.openSync (fs.js:427:18)
at Object.fs.readFileSync (fs.js:284:15)
at Object.Module._extensions..js (module.js:473:44)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at instController (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:79:31)
at init (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:57:8)
at route (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/dispatcher.node.js:268:36)
La ligne de code appelant ce fichier (mvc.node.js: 79) est
this.currentRoute.class = require( controllerFile )[dispatchClass].bind( this );
(c'est un cadre que je crée)
Comme vous pouvez le constater, le fichier auth.node.js est appelé par une requête REQUIRE. Par conséquent, les solutions fournies avec gracefullFS et similaires ne s’intègrent pas. En outre, ce problème concerne uniquement MacOS. Dans un Ubuntu semble bien fonctionner.
Des pensées?
Vous pouvez résoudre ce problème en augmentant la limite maxfiles
:
launchctl limit maxfiles 16384 16384 && ulimit -n 16384
j'ai eu cette erreur et l'ulimit et le launchclt n'ont pas fonctionné pour moi,
cette solution de http://yabfog.com/blog/2014/10/22/yosemite-upgrade-changes-open-file-limit a fonctionné pour moi
echo kern.maxfiles=65536 | Sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | Sudo tee -a /etc/sysctl.conf
Sudo sysctl -w kern.maxfiles=65536
Sudo sysctl -w kern.maxfilesperproc=65536
ulimit -n 65536 65536
puis en mettant le
ulimit -n 65536 65536
dans ~/.bashrc
à votre santé
Fourmi
Votre code ouvre trop de fichiers. Par défaut, OS X a une limite de 256 fichiers ouverts simultanément. Lorsque votre code nécessite un nouveau module, le noeud doit ouvrir le fichier pour le lire. Si vous êtes déjà à cette limite, la demande du noeud ne peut pas continuer et génère une erreur. Vous devez vérifier les emplacements de votre application où vous appelez fs.open et vous assurer que vous fermez correctement tous ces fichiers. Vous pouvez également rencontrer ce problème si vous essayez d'effectuer trop de lectures simultanées du système de fichiers, car chaque lecture en attente sera un fichier ouvert. J'ai également rencontré ce problème lors de l'utilisation de fs.watchFile, qui nécessite également l'ouverture d'un descripteur sur le fichier.
Vérifiez votre ulimit. Par exemple, initialement, mon ulimit sous OSX était 256
ulimit -n
pour voir la limite. ulimit -n 1024
pour définir une limite supérieure.Aucune des autres réponses n'a fonctionné pour moi. Cela a fait le tour:
launchctl limit maxfiles 16384 16384
Notez également que ceci n'enregistre pas toutes les sessions. Par conséquent, à moins que vous ne vouliez l'exécuter pour chaque session de terminal bash, je suggère de placer la ligne ci-dessus dans votre ~/.bashrc (ou ~/.zshrc si vous utilisez zsh) en ligne de commande:
vi ~/.bashrc
ulimit est idéal si vous utilisez le terminal, mais cela ne fonctionne que si vous exécutez votre application à partir du même onglet de terminal (ou instance de shell). Launchctl est génial mais concerne tout le système. Si vous laissez la limite maxfile Launchctl seule, la limite souple est 256 et la limite stricte est illimitée.
Dans un environnement de production, vous devrez probablement lancer au démarrage et redémarrer en cas de plantage, ce qui signifie que la meilleure solution pour Mac OSX consiste à utiliser un fichier .plist pour chacune de vos applications. Je lance mon application de noeud en utilisant ledit fichier plist (qui s'exécute au démarrage et redémarre après une panne) ... dans ce fichier, vous pouvez définir le nombre de fichiers par application à l'aide de la clé SoftResourcesLimit
.
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>16384</integer>
</dict>
Le nombre maximum de fichiers a été réinitialisé à 256
sous OS X 10.10.3 Yosemite. Cela peut entraîner des problèmes avec les installations npm. Vous pouvez vérifier cette limite depuis le terminal avec la commande ulimit -n
. Pour changer cela au-delà de 256
, vous devez créer deux fichiers de configuration.
Le premier fichier de liste de propriétés /Library/LaunchDaemons/limit.maxfiles.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>65536</string>
<string>65536</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
Le deuxième fichier de liste de propriétés /Library/LaunchDaemons/limit.maxproc.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxproc</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxproc</string>
<string>2048</string>
<string>2048</string>
</array>
<key>RunAtLoad</key>
<true />
<key>ServiceIPC</key>
<false />
</dict>
</plist>
Définissez la propriété et les droits appropriés:
Sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
Sudo chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist
Sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist
Sudo chmod 644 /Library/LaunchDaemons/limit.maxproc.plist
Définissez les limites souhaitées sur le fichier de profil bash (.bashrc
ou .bashprofile
ou similaire):
ulimit -n 65536
ulimit -u 2048
Assurez-vous que les droits sont les mêmes pour le profil bash:
chmod 644 .your_bash_profile_file
Redémarrez l'ordinateur et vérifiez avec les fichiers ulimit -n
max. Ce devrait être 65536
et vous devriez pouvoir le changer en-dessous.
Source: http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X
J'utilise watchman
. Ce qui corrige ces erreurs pour moi. Ça vaut le coup d'essayer!!!
brew update
brew install watchman
la réponse de awongh a fonctionné pour moi
ulimit -n 10480
Mais seulement après avoir démarré un shell interactif
Sudo -i
En dehors de Shell, je continuais à avoir une erreur d'autorisation sur OSX Yosemite
Pour ce qui est des autres questions sur l'erreur EMFILE, vous devez gérer une file d'attente afin de limiter le nombre de fichiers ouverts en même temps. L'augmentation de la limite ne fera que retarder votre problème.
Il y a quelques réponses ici: node et Error: EMFILE, trop de fichiers ouverts