Le Générateur de processus waitFor() question et Ouvrir le fichier limitations
J'ai hérité un peu de code:
Process p = new ProcessBuilder("/bin/chmod", "777", path).start();
p.waitFor();
Fondamentalement, il y a pour certains anciens et très vaudou basé raison pour stocker des paires clé/valeur sur le disque comme des fichiers. Je n'ai pas vraiment envie d'aller en elle.
Cependant, je suis parti avec un groupe de OI exceptions:
Exception :Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Message: Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Et par un groupe, je veux dire dans les domaines de 10k - des millions
J'ai l'impression que le waitFor appel a été d'arrêter de se produire en attente pour le processus de le terminer et quitter retour, cependant, je pense que le chmod est de retourner un résultat avant que le fichier est fermé. Personne ne sait si ce serait la cause de ces exceptions?
Mes autres inclinaison est que l'ouverture et la fermeture de milliers de fichiers ne se fait pas assez rapidement sur le java fin et qu'il y a autre chose, peut-être quelque chose comme ça, il y a une certaine forme de mémoire tampon de fichier qui n'est pas effacé lors de la fw.close() est appelée.
Je suis assez nouveau à java et cela a été un enfer bizarre, qui m'a déconcerté. (plaisir de l'application s'exécute toujours en quelque sorte.. après crachant un très gros fichier journal qui est)
Une autre personne peut penser à un moyen de contourner ce problème, la compensation des tampons ou l'augmentation de l'ouverture des fichiers limiter à quelque chose où la jvm peut rivaliser avec elle-même (en supposant que c'est le problème)
debian, il semble être effacée de la commande uname. sera la dernière version stable.
OriginalL'auteur Louis | 2009-07-15
Vous devez vous connecter pour publier un commentaire.
Je présume que vous êtes l'exécution de ces commandes chmod dans une boucle - sinon, je ne vois pas pourquoi vous seriez donc de nombreuses exceptions. Il est possible que vous soyez atteint un blocage parce que vous n'êtes pas la lecture de la sortie du processus lancés. Que certainement utilisé à la mords-moi retour à l'ère pré-
ProcessBuilder
,Runtime.exec()
jours.Changer votre extrait de code ci-dessus pour le modèle:
(crédit: ce site) et voir si cela aide la situation.
Je pense que je l'ai résolu vérifier ma réponse en quelques minutes - attente sur des tests pour vérifier
Ok choisi la vôtre comme la réponse qu'il avait besoin de cette dans la solution, vérifier mon poste comprennent les lignes supplémentaires nécessaires.
OriginalL'auteur Vinay Sajip
Merci pour l'aide les gars, cela devrait régler une charge de la folie passe ailleurs à cause de cela.
À l'aide de votre(Vinay) l'exemple et le flux de fermetures:
A eu l'idée de John B Mathews post.
Bonne prise, jim, mais je vois encore un problème dans votre
finally
. Je pense que vous devez avoir chacun desclose
appelle dans leur proprecatch
, sinon, si une exception se produit lorsque vous faitesp.getInputStream.close()
, vous vais ne parviennent pas à fermer les autres. Le problème semble avoir disparu aujourd'hui, mais pourrait revenir plus tard.bon point. merci
Avez-vous vraiment besoin de fermer l'entrée d'erreur et de flux, même si ils sont fusionnés avec
redirectErrorStream
? Et avez-vous vraiment besoin de fermer le flux de sortie, même si vous n'avez jamais utilisé?Vous auriez besoin de tester les deux et de savoir. Ce post est très vieux, je ne pense pas que le code est même plus vivre.
OriginalL'auteur Louis
Il semble peu probable que le processus serait en fait complète sans fermer les fichiers. Cela pourrait-il se produire dans un très grand nombre de threads? Ou peut-être que certains d'entre eux ne sont pas réellement terminer (c'est à dire, il est accroché à waitFor dans certains cas)?
Sinon, je pense que vous serez coincé avec l'augmentation de la ouvrir des fichiers limite. En supposant que c'est un système de type Unix, le "ulimit de la commande" est probablement ce que vous cherchez.
OriginalL'auteur jsight
Si vous utilisez la version 6 de JAVA, vous pouvez également essayer la nouvelle setters (lecture,écriture,exécution) sur le Fichier objet. Peut-être plus lent, mais il devrait fonctionner.
OriginalL'auteur Ryan Fernandes