Exécuter des scripts Unix dans Java EE env?

Quelqu’un peut-il s’il vous plaît partager son expérience en invoquant des scripts unix à partir d’un env Java EE, servlet ou EJB? Notez que ces scripts doivent être appelés pour un traitement en temps réel et non pour un traitement hors ligne.

La création de processus à partir d’un conteneur Java EE n’est probablement pas la bonne solution. Si ce sont des scripts shell, ils ne seront pas portables. Si vous souhaitez utiliser le support de transaction, vous pouvez réécrire les scripts en tant que Jobs en utilisant Quartz Scheduler . Il est plus probable que la méthode Java EE fasse des choses comme ça.

EDIT: Avec vos exigences ajoutées dans les commentaires, cela devrait fonctionner

Process process = new ProcessBuilder(command).start(); 

Plus de détails ici

veuillez noter que si vous utilisez des scripts et / ou des tubes (pas d’exécutables natifs), vous devez inclure le shell pour appeler la commande (et configurer les tubes)

Une possibilité serait d’écrire une petite application qui écoute une queue JMS et appelle les scripts. De cette façon, l’exécution du script est séparée du serveur d’applications, et ne rencontre donc aucune limitation de spécifications.

Le plus gros problème que vous rencontrerez est que si l’image de la mémoire de votre serveur d’applications est volumineuse, lorsque vous exécutez le script, vous risquez de manquer de mémoire et de faire échouer le fork. Lorsque vous lancez, le système doit faire une copie complète de l’image exécutable. Il ne fait pas de copie physique, mais il doit en créer une virtuelle. Donc, si vous avez un gros tas Java EE, comme 4G de mémoire réelle (c.-à-d. Pas seulement du tas Java, taille totale du processus), alors vous avez besoin d’une 4G de mémoire vive réelle et / ou d’un swap supplémentaire espace virtuel pour arriver.

Oui, vous allez immédiatement exécuter sh ou une autre commande qui ne va pas aspirer un million de ressources. Mais le système ne peut pas le savoir et il doit donc agir comme s’il devait exécuter deux copies de votre conteneur Java EE à la fois, même pour une nanoseconde.

Si vous n’avez pas les ressources pour le fork, le fork échoue.

Si vous êtes à court d’espace, ce que vous pouvez faire, c’est créer un petit démon de lancement mini exec. Ensuite, au lieu d’utiliser votre application Java EE pour ouvrir le processus, il vous suffit d’ouvrir un socket sur votre démon, et le processus informatique est interrompu. Évidemment, on s’attend à ce que ce petit démon consum beaucoup moins de ressources que votre conteneur.

Le démon peut être aussi simple que d’exécuter la ligne de commande sur le socket, et simplement exécuter ce qu’il obtient (potentiellement dangereux, naturellement, mais …), ou simple rpc avec un code de commande et quelques arguments. Tout ce qui convient à votre projet. Vous pouvez l’écrire en Java, un langage de script (Python, Perl, Ruby), peu importe. Beaucoup de façons de faire ça.