2016-03-22 24 views
0

sshを使用してリモートマシン上でJavaプログラムを起動し、マシンにログインしてからコマンドを実行します。 sshセッションは、JCraft Javaライブラリを使用して作成されます。プロセスはRESTサーバーを開始し、 '&'とバックグラウンドに入れられます。私は、現時点で使用していますリモートJavaプロセスを監視する方法

java -cp $ATFIMAGE/atf.jar com.atf.agent.jobs.SlaveRunner dub-001948-VM01 8888 8889 > /home/john/testHome/SlaveRunner_stdout.log 2> /home/john/testHome/SlaveRunner_stderr.log & 

アプローチリモートサーバーからの標準エラー出力ファイルをscpが、それが空だかどうかを確認することです。次のようにプログラムが開始されます。ファイルが空の場合は、正しく起動したと言えます。これは動作しますが、それはその堅牢ではありません:Javaプロセスの開始の遅れがある場合は、標準エラー出力を空にすることができ

session.command(javaCmd); 
    manager.copyArtefactFromTarget(remoteHost, remoteStdErrFile, localFileSystem); 

、その後、私は、サーバーからそれを収集した後、埋め。

プロセスがバックグラウンドに置かれるため、UNIX出口コードを使用することはオプションではありません。プロセスが終了するとコードを取得するだけですが、この場合はプロセスが開始されませんでした。

プロセスを監視する方法があるかどうか、およびプロセスが正しく開始されているかどうかは疑問です。

+0

関連:http://stackoverflow.com/questions/1908610/how-to-get-pid-of-background-process – JimmyB

+0

あなたが心配しているのは、「正しく開始しましたか?あなたはサーバーに要求をしようとしますか? – JJF

+0

プログラムの後半でサーバーに要求を行い、そこに再試行メカニズムを実装しました。 RESTサーバーは起動していないので、これは決して成功しません。それはいろいろな理由で失敗する可能性があります。間違ったjavaバージョン、クラスパス上のjavaなど。私はそれが開始されたかどうかのフィードバックを得たいので、問題のユーザに通知することができます(例えばクラスパス上のjavaではありません)。手作業による介入が必要なので、ユーザーが修正してプログラムを再実行するまでは、ユーザー自身の責任で行ってください。 – eeijlar

答えて

1

あなたは介して、あなたのバックグラウンドタスクのプロセスIDを取得することができます

echo $!

How to get PID of background process?を参照)

次にあなたが例えば(参照プロセスがまだ生きている場合はポーリングすることPIDを使用することができますhttps://stackoverflow.com/a/14880926/1015327 )。プロセスが終了した場合、それに応じて対応することができます。 RESTサービスが機能したらポーリングを停止することができます。また、一定の時間内にRESTサービスをアクティブ化できない場合、プロセスを強制終了することもできます。

しかし、私の場合、あなたのプロトコルは少し複雑でエラーを起こしやすいようです。 (Java-)サーバーを実行するための他のアプローチを検討しましたか?

+0

それはおそらくうまくいくかもしれませんが、私はあなたが正しいと思います。私はそれもエラーが起こりやすいと思います。私はサーバーを起動するための他のアイデアは持っていません。 – eeijlar

関連する問題