次のコマンドを使用してRuntime.getRuntime().exec()
でWindowsでバッチファイルを実行するJavaプログラムがあります。
cmd /C start "Title" "C:\Folder\file.bat"
cmd /C
がコマンドを実行して終了するため、Javaプログラムはすぐに終了します (1) およびstart "Title" "C:\Folder\file.bat"
startsバッチスクリプト (2)。したがって、プロセス(バッチファイル)は独立して実行を継続します。
ここで、Javaから起動し、同様の動作をするシェルスクリプト(たとえばfile.sh
)があるとします。 。同等のコマンドになる方法 (3) Linuxで?
注
"Title"
)は必要ありません。スクリプトを起動する方法は、そのパスを指定することです:
/path/to/script.sh
親プロセスが終了した場合に続行するには、&
を追加してバックグラウンドで起動するだけです。
/path/to/script.sh &
したがって、たとえば、あるスクリプトが別のスクリプトを次のように呼び出している場合:
#!/bin/bash
script2.sh &
script1.sh
を実行してscript2.sh
を呼び出すと、バックグラウンドに送信されるため、すぐに終了できます。
多くのオプションがありますが、より興味深いものは次のとおりです。
Ubuntuの場合、gnome-terminal
を使用できます。
gnome-terminal -c "/home/$USER/file.sh" -t "Title"
ほとんどのLinuxと互換性を持たせたい場合は、xterm
を使用できます。
xterm -T "Title" -e "/home/$USER/file.sh"
パスは/home/$USER/file.sh
です(Windows 7で同等:C:\Users\%UserProfile%\file.bat
)
file.sh
の内容は次のようになります。
#!/bin/bash
echo "In a World without Walls nor Fences, the people don't need Windows and Gates"
sleep 2
Linuxでスクリプトを実行するさまざまな方法:私の任意のスクリプト名は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:これはこの時点では単なる通常のファイルです。bash ex2で実行します:foo.batを実行可能としてマークしました。 ($ chmod + x foo.bat) ex3:コマンド置換 ex4: "` `" ex5を使用して実行:実行可能ファイルへのパスを使用します。
これらが最も一般的です。 gnome-terminalやxtermのようなものを呼び出さないようにします。これらは、bashやshのようなものに比べてあまり一般的ではないシェルです。たとえば、Ubuntu mateを使用します。 xtermもgnome-terminalもありません。しかし、私にはbashがあります。 Linux/mac osxを実行している他のほとんどの人と同様に。
スクリプトの実行に関するこのチュートリアルに感謝します here
スクリプトfoo.batはこれを行います:
$ ./foo.bat
Having a bash ./foo.bat
その内容は次のとおりです。
$ cat foo.bat
#!/bin/bash
echo -e "Having a bash" $0
$ 0を使用すると、希望するタイトル機能が得られると思います。さらに多くの可能性があります。
私が理解しているように、Java内から外部コマンドを実行し、Javaプロセスを(非同期で)継続したいのに、その外部コマンドも実行し続けたいと思いますか?
ここに私がホイップした小さなテストがあります:
[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はプログラムを正常に実行します(単に「newfile」ファイルを作成します)。また、execを呼び出した後、Doneメッセージを印刷する独自の方法で続行します。
端末ウィンドウも開きたい場合は、呼び出し文字列にプレフィックスを付けます
Runtime.getRuntime().exec(["gnome-terminal", "-e"]+args);
したがって、質問に答えるには、指定したメソッドを呼び出すだけのように見えます。あなたは別の行動を得ていますか?