2016-12-20 4 views
2

MacOSのJavaアプリケーション内から、Runtime.getRuntime().exec("open -Wn filename")を使用してデフォルトアプリケーションでファイルを起動し、表示アプリケーション(pdfの場合はAdobeReaderなど)と呼ぶことができます。それはうまく動作します。MacOSのopenコマンドから起動されたアプリケーションプロセスからpidを取得

表示アプリケーション(たとえば、AdobeReader)を閉じるときに問題が発生します。

openコマンド自体がjavaアプリケーションの子プロセスとして起動されますが、openコマンドは子プロセスではなく表示されたアプリケーションを子プロセスとして起動します(launchd(1))。その結果、Javaアプリケーションからプロセスを破壊すると、開いているプロセスだけが強制終了されますが、表示アプリケーションは終了しません。

これまでのところ、私は視聴アプリケーションプロセスのPIDを取得してそれを強制終了できませんでした。 psで私はアプリケーション名を持っているときにしか見つけることができませんが、それは私が持っていないものです。

誰もが私は

  • は(openがの親プロセスではありません、覚えているアプリケーションの名前またはUTIを知らなくても、openコマンドから起動されたアプリケーションのPIDを取得することができる方法のアイデアを持っています表示アプリケーション)?

または

  • 起動されたアプリケーションopenプロセスの子を作るので、私はopenプロセスを殺すことによって、それを殺すことができますか?

または

  • 他の可能な解決策?

あなたのアイデアは非常に高く評価されています。

lsof -t filename

PIDを持つ、私はプロセスを強制終了することができ、表示アプリケーションを意味します

答えて

0

は、私は、ファイル名を知っているので、 lsofコマンドからPIDを取得することにより、解決策を見つけました

kill $(lsof -t filename)

完全なソリューションは、次のようになります。

String killCommand = "kill $(lsof -t " + filename+ ")"; 
ProcessBuilder builder = new ProcessBuilder("bash", "-c", killCommand); 
builder.start(); 

それほどきれいではありませんが、それは仕事です。

関連する問題