J'ai un programme Java qui exécute un fichier de commandes sous Windows avec Runtime.getRuntime().exec()
à l'aide de la commande suivante:
_cmd /C start "Title" "C:\Folder\file.bat"
_
Le programme Java se termine rapidement car cmd /C
exécute la commande, puis se termine. (1) et start "Title" "C:\Folder\file.bat"
lance le script de traitement par lots (2). Ainsi, le processus (le fichier de commandes) continuera à s'exécuter indépendamment .
Supposons maintenant que j’ai un script Shell (par exemple file.sh
), que je souhaite lancer à partir de Java et a un comportement similaire. Comment pourrait-il être la commande équivalente (3) sous Linux?
Notes
"Title"
) n'est pas obligatoire.La manière de lancer un script est de donner son chemin:
/path/to/script.sh
Pour qu'il continue si le processus parent se termine, vous pouvez simplement le lancer en arrière-plan en ajoutant &
:
/path/to/script.sh &
Donc, si vous avez, par exemple, un script en appelant un autre comme ceci:
#!/bin/bash
script2.sh &
Vous pouvez exécuter script1.sh
qui appellera script2.sh
et, puisqu'il est envoyé en arrière-plan, quitte immédiatement.
Vous avez plusieurs options, les plus intéressantes sont les suivantes:
Si c'est pour Ubuntu, vous pouvez utiliser gnome-terminal
:
gnome-terminal -c "/home/$USER/file.sh" -t "Title"
Si vous voulez le rendre compatible avec la plupart des linux, vous pouvez utiliser xterm
:
xterm -T "Title" -e "/home/$USER/file.sh"
Le chemin est /home/$USER/file.sh
(équivalent Windows 7: C:\Users\%UserProfile%\file.bat
)
Le contenu de file.sh
peut ressembler à ceci:
#!/bin/bash
echo "In a World without Walls nor Fences, the people don't need Windows and Gates"
sleep 2
Différentes façons d’exécuter un script sous Linux: mon nom de script arbitraire est foo.bat
ex1: $bash foo.bat
ex2: $./foo.bat
ex3: $echo $(~/Desktop/foo.bat)
ex4: `~/Desktop/foo.bat`
ex5: $ /path/to/Shell/script/foo.bat
ex1: il s’agit d’un fichier ordinaire, nous l’exécutons avec bash ex2: nous avons marqué foo.bat comme exécutable. ($ chmod + x foo.bat) ex3: Substitution de commande ex4: exécuter en utilisant "` `" ex5: nous indique le chemin d'accès à l'exécutable.
Ce sont les plus communs. J'éviterais d'appeler des choses comme gnome-terminal et xterm. Ce sont des coquilles moins communes comparées à des choses comme bash et sh. Par exemple, j'utilise Ubuntu mate. Je n'ai ni xterm ni gnome-terminal. Mais, j'ai bash, et sh. comme presque tout autre personne sous Linux/mac osx.
Vous pouvez apprécier ce tutoriel sur l’exécution de scripts here
le script foo.bat fait ceci:
$ ./foo.bat
Having a bash ./foo.bat
où son contenu sont:
$ cat foo.bat
#!/bin/bash
echo -e "Having a bash" $0
Je pense que l'utilisation de $ 0 peut vous donner la fonctionnalité de titre que vous souhaitez peut-être. Beaucoup plus de possibilités existent.
Si j'ai bien compris, vous souhaitez exécuter une commande externe à partir de Java et laisser le processus Java se poursuivre (de manière asynchrone) pendant que cette commande externe continue également de s'exécuter?
Voici un petit test que j'ai fouetté:
[tai@flenux runproc ] $ ls
filecreator.sh ProcRunner.class ProcRunner.Java
[tai@flenux runproc ] $ cat filecreator.sh
touch newfile
[tai@flenux runproc ] $ cat ProcRunner.Java
public class ProcRunner {
public static void main(String[] args) {
try {
Runtime.getRuntime().exec(args);
Thread.sleep(2000);
System.out.println("Done");
} catch(Exception e) {
System.err.println(e.toString() );
}
}
}
[tai@flenux runproc ] $ Java ProcRunner bash filecreator.sh
Done
[tai@flenux runproc ] $ ls
filecreator.sh newfile ProcRunner.class ProcRunner.Java
[tai@flenux runproc ] $
Java exécute avec succès le programme (qui crée simplement le fichier "newfile"); il continue également de son côté à imprimer le message Done après avoir appelé l'exécutable.
Si vous souhaitez également qu'une fenêtre de terminal s'ouvre, préfixez la chaîne d'appel
Runtime.getRuntime().exec(["gnome-terminal", "-e"]+args);
Donc, pour répondre à votre question, il semble que vous appelez simplement la méthode que vous avez spécifiée. Avez-vous un comportement différent?