2016-07-05 15 views

答えて

1

実行したコマンドはnohupであり、すぐに終了しました。 nohup個別のPythonプロセスが起動しましたが、これはプロセスではありませんpが制御しています。

nohup&はなぜ必要な機能ではないのですか?あなたは、単にPythonのサブプロセスを実行したい場合は、単に呼び出す:

Process p = Runtime.getRuntime().exec("/usr/bin/python " + filePath); 

注それは配列を受け取りexecのオーバーロードを使用することも、より安全だということを、あなたは文字列連結を自分で行う必要はありませんので、 (したがって、ある種のセキュリティ悪用を避ける)。

Process p = Runtime.getRuntime().exec(new String[]{"/usr/bin/python", filePath}); 

またはProcessBuilderと::わずかに構文の変更

Process p = new ProcessBuilder("/usr/bin/python", filePath).start(); 
+0

助けてくれてありがとう。私が持っているように見える問題は、バックグラウンドプロセスが実際に直ちに終了することです。私は端末から同じコマンドを実行するとうまく動作しますが、Javaプログラムから実行して、それを実行しているすべてのPythonプロセスを見ると、リストされません。私はそれを起動する必要がありますWebアプリケーションを使用するに行くとき – SVN600

+0

@ SVN600をログに追加し、コードをデバッグを追加しようとすると接続できません。プロセスが終了するように具体的に[wait](https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html#waitFor--)し、[exit code](https ://docs.oracle.com/javase/8/docs/api/java/lang/Process.html#exitValue--)、[stdout](https://docs.oracle.com/javase/8/docs/) api/java/lang/Process.html#getInputStream--)、[stderr](https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html#getErrorStream--) 。これらは、プロセスがクラッシュする理由についてのヒントを提供するはずです。 – dimo414

0

&オペレータhereのドキュメントをご覧ください。プロセスはバックグラウンドで実行されています。あなたが書いているJavaプログラム(とそのシェルについて)に関しては、あなたが行った呼び出しはすでに終了しています。これはまだバックグラウンドで実行されていますが、出力に注意を払わずに移動するようにシェル(拡張子はJavaプログラム)に指示しています。

+0

実行中のプロセスを見ると、pythonスクリプトはそのうちの1つではありません – SVN600

0

Sean Brightが言いましたように、実行しているスクリプトの末尾に「&」という文字が含まれています。基本的にすべての* nixシステムで。 makeコマンドをタイプして、アンパサンドを使用すると、そのプロセスはバックグラウンドで実行されます。 Javaプロセスの呼び出しが終了したのはそのためです。

バックグラウンドでコマンドを実行しないでください( '&'はありません)。Process.isAlive()を定期的に呼び出して、プロセスが終了したかどうかを判断するほうがよいでしょう。

関連する問題