2009-05-14 6 views
1

J'ai une application Java composée d'un Thread qui surveille une table de la base de données contenant des scripts shell à exécuter. Je regarde la base de données, toutes les quelques secondes. pour un script, exécutez-le (via la classe Process) et attendez un autre script dans la table.Exécution indépendante de scripts shell à partir d'une application Java

Mon problème est: Parfois, certaines commandes du script échouent. Le thread capture le flux d'erreurs et le consigne dans la base de données. Toutefois, il conserve la consignation des messages et le contrôle ne revient pas du script au thread Java, ce qui empêche les scripts shell suivants de s'exécuter dans la base de données.

Y a-t-il un travail pour cela?

+0

Existe-t-il un moyen de détecter une condition d'erreur et d'appeler process.destroy()? –

Répondre

3

Lisez-vous à la fois standard et erreur standard? Faites-vous cela dans des fils séparés? Il est possible de bloquer l'un ou l'autre en fonction de la façon dont vous consommez les sorties de script, et j'ai le pressentiment que votre script est bloqué en attendant que le processus parent utilise sa sortie.

De la documentation Process:

Parce que certaines plates-formes natives ne fournissent que la taille de la mémoire tampon limitée pour les flux d'entrée et sortie standard, le défaut d'écrire rapidement le flux d'entrée ou de lire le flux de sortie du sous-processus peut entraîner la sous-processus bloquer, et même impasse

Voir this question et l'exemple de code référençant 'flux gobblers'. 2 'gobbler sont créés, consommant standard et erreur standard.

+0

Je suis en train de lire les deux flux dans le même fil, et de le connecter. Je veux juste trouver un moyen de sortir du mode de blocage, après l'erreur se produit au lieu de continuer à l'imprimer. – Epitaph

+1

Vous devrez * avoir * à lire sur des threads séparés, pour continuer à consommer les flux de sortie/erreur et empêcher le blocage de exec(). Je suspecte quand vous rencontrez une erreur, l'un des blocs bloque parce qu'il n'est pas consommé (stderr?) Et donc vous bloquerez. –

Questions connexes