7
votes

Java exécutant Bash Script, Erreur = 26 Fichier texte occupé

J'ai un code Java qui écrit un script de Bash Linux, puis effectuez une chmod pour ajouter une autorisation d'exécution, puis essayant de l'exécuter. Je reçois une exception d'IoException au début du processus disant erreur = 26, fichier texte occupé. J'ai vérifié que le fichier est terminé en cours d'écriture et que le flux était fermé. strong> s> Le chmod fonctionne bien, mais je continue à obtenir cette erreur.

J'ai remarqué. Que si j'exécute un débogueur et pas à travers le code, cela ne reçoit pas l'erreur, il est donc clairement impliqué dans un problème de synchronisation. Comment puis-je vous assurer que le chmod est terminé avant d'essayer d'exécuter le script Bash? J'aimerais éviter des solutions non fiables telles que l'ajout de thread.sleep (10000) et des éléments "hacky" comme mettre l'exécution dans un bloc d'essai / attraper dans une boucle qui essaie jusqu'à ce qu'il réussisse. P>

J'ai une bonne quantité de code qui enveloppe le démarrage du processus avec des threads d'écoute, etc., mais voici une version simplifiée de ce qu'elle fait (essayé également ce code et il a le même résultat): P>

String[] cmd1 = {"/bin/chmod", "750", postFile };
new ProcessBuilder(cmd1).redirectErrorStream(true).start().waitFor();
String[] cmd2 = { postFile };
new ProcessBuilder(cmd2).redirectErrorStream(true).start().waitFor();


3 commentaires

Pourrions-nous avoir du code? Comme la façon dont vous exécutez votre chmod? Merci


Vérifiez que vous n'avez pas le fichier ouvert dans plusieurs emplacements.


Merci pour cela. J'ai eu le même problème et il y avait une classe totalement non liée et éliminée qui avait ouvert le dossier mais ne l'a pas fermé.


4 Réponses :


0
votes

Je ne sais pas si c'est associé, mais vous devez généralement obtenir ou rediriger l'erreurstream et l'introuvream (je les obtiens habituellement dans une responsabilité à laquelle je crée, je ne connais pas le choix de redirection).


1 commentaires

J'ai du code pour faire cela et un fil séparé qui écoute. Je n'ai posté qu'une version simplifiée du code, car j'ai une classe entière dédiée à elle. FYI, je redirige l'erreur dans le flux de sortie pour la simplicité.



8
votes

Êtes-vous sûr qu'il est le chmod qui est responsable de l'erreur suivante? Pourriez-vous vérifier que vous avez définitivement Fermer le fichier de sortie avant d'essayer de l'exécuter?

Si vous le fermez, je suis une perte pour laquelle Chmod devrait causer cette erreur, mais vous pouvez éviter la nécessité de lancer Chmod en utilisant votre shell pour exécuter le script:

chaîne [] cmd = {"bash", postfile};


2 commentaires

J'ai essayé votre suggestion "String [] cmd2 = {" / bin / sh "," -c ", postfile};, je reçois la même erreur. Je reviens et vérifie que les flux sont fermés à nouveau pour être sûr.


Tu avais raison. La classe que j'utilisais pour décompresser le fichier ne ferme pas son flux. Doh!



8
votes

Pour une référence future, elle peut avoir été causée par un flux non décalé dans ce cas particulier, mais la définition des autorisations sur un fichier immédiatement suivies de l'exécution du fichier peut également provoquer cette erreur:

Files.setPosixFilePermissions(Paths.get(scriptPath), set(PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.OWNER_READ));
ProcessBuilder processBuilder = new ProcessBuilder(scriptPath).directory(workingDir);
processBuilder.start();


0 commentaires

0
votes

Dans mon fichier de service dans / etc / systemd / system / J'ai dirigé des sorties pour enregistrer des fichiers: StandardOutput = fichier: /Home/pi/ApplicationLogs/aplication_l_debug.log StandardError = Fichier: /Home/pi/ApplicationLogs/aplication_l_error.log

Le message d'erreur a disparu lorsque j'ai modifié les autorisations sur le répertoire ApplicationLogs pour écrire des autorisations à tous. ( chmod A + W ApplicationLogs )


0 commentaires