2017-08-10 3 views
1

私は、Linuxシステム上でコンソールベースのプログラムを実行するJavaアプリケーションを持っています。これらのプログラムの出力を読んでいて、JavaアプリケーションがWebページに送信しています。Java起動独立プロセス

しかし、いったん私のJavaアプリケーションを閉じると、すべてのプロセスが「スタック」するか、単にクラッシュするだけです。だから私はいつも私のJavaアプリケーションにいくつかの変更を加えたいと思うし、私はそれを再起動する必要があります私はまた、私のアプリから実行されているすべてのプロセスを閉じる必要があります。私は彼らのPIDを保存して私のアプリケーションを終了し、プロセスの保存されたPIDに基づいてそれらのプロセスを制御(出力ストリーム)します。

これを行う方法はありますか?

私はこのように私のプログラムを実行しています:

ProcessBuilder processBuilder = new ProcessBuilder(new String[] { "su", "- 
s", "/bin/sh", "myuser", "-c", "java -jar myjar.jar" });, 
Process p = processBuilder.start(); 

編集:

私の問題は、私の問題は私のjavaアプリからlanched私のサブプロセスが私のjavaアプリの後にクラッシュされていることであるプロセスのPIDを見つけていません私のアプリが再起動/停止している間も実行を継続する必要があります。

+0

unix.stackexchangeで、私はこれを見つけた:https://unix.stackexchange.com/questions/31824/how-to-attach-terminal-to -detached-processこれで問題が解決したことを確認できますか? – ControlAltDel

+0

これは私の問題を解決しません、そのjava関連端末関連ではない。私はターミナルではなくjavaで自分のプロセスを「分離」する必要があります。私は何とか私はJavaアプリケーションから私のプロセスを起動している方法を変更する必要があります。それは私が助けを求めているものです。 – Welite

答えて

2

問題は、UNIXジョブ制御と呼ばれています。

多くのシェルと同様に、/bin/shはSIGHUPシグナルとSIGINTシグナルをインターセプトし、終了する前に、その構成と状態に応じてシグナルを子プロセスグループの一部に送信します(例えば、停止したバックグラウンドプロセスはSIGCONTを受信します) 。

したがって、あなたのメインjavaアプリケーションが閉じられると、アプリケーションがforkした/bin/shシェルが終了し、終了する直前にコマンドjava -jar myjar.jarに対応するサブプロセスにSIGHUPシグナルが送信されます。

huponexit/bin/shシェルオプションを使用すると、サブプロセスの殺害を避けることができます。彼らは、もしあれば、コントロールターミナルから切り離されますが、彼らは殺されません。だから、

shopt -u huponexit; java -jar myjar.jarによってこのjava -jar myjar.jarを置き換える:

ProcessBuilder processBuilder = 
    new ProcessBuilder(new String[] { 
    "su", "-s", "/bin/sh", "myuser", "-c", 
    "shopt -u huponexit; java -jar myjar.jar" 
    }); 
Process p = processBuilder.start(); 
+1

ありがとう!それは私が必要としていたものなのですが、今度は、すべてのサブプロセスを閉じずにアプリケーションを再起動してから、アプリケーションを再起動した後で制御することができます:) – Welite

1

Linuxでpsコマンドを使用して、実行する各プロセスの番号を取得します。もちろん、ProcessBuilderの場合と同じように実行します。私はパイプします。 "|" (Linuxコマンド)、Javaプロジェクトのどこかに保存したファイルに出力します。

のps -Aの行の長さになりますJavaプログラムから実行するLinuxコマンド| grep "your_program_name"> /path/to/your/project/my_process_list_file.txt

ここで、>は実行されたコマンドの出力をファイルに保存します。

このファイルから読み込んで、他のLinuxコマンドを実行して、そのプロセスを制御してください。

幸運、私の友人を幸せにコーディング!

+1

おかげさまでお答えいただきましたが、私の問題ではありませんが、私は自分の投稿を編集しました。それを見てください、ありがとう:) – Welite

+0

ああ、私が参照してください!私は私の答えで正確なベースに触れていないと思った。それほど恩恵を受けることを望みます。加えて、この質問は実際に私が問題を解決するのを助けました。私が経験していた自分のプログラムでもありました。 –

1

は、このようなあなたのコマンドを実行してください:

Runtime.getRuntime().exec("gedit"); 

それは独立したプロセスで指定された文字列コマンドを実行します。

1

少し前に私はいくつかの有用な情報を見つけましたhere。これを試して。

+0

ただのアイデア - 私はそれを試していない。 linux envでは、 'nohup'コマンドを使うことができます。 – Nequeq

関連する問題