プロが教える店舗&オフィスのセキュリティ対策術

Java 特定プロセス名前取得方法について

こんにちわ。
昨日に引続きまた質問させてください。

Javaで特定のプロセス名(OpenOfficeのプロセス名:soffice.exeだったかな?)を取得したいのですが、何か良い方法は無いでしょうか?

環境
eclipse3.5
jdk1.5
jooconverter.jar
openoffice1.4

やりたいこと
・ExcelからPDFにファイル内容を丸ごと変換(jooconverter.jar、openofficeを使用)
・どうやら、openofficeのコネクタを取得しなければ、変換出来ない為Thrad.sleep()で若干とめてます。
・その止めるのを毎回ではなく、1日1回若しくはopenofficeが起動していない時だけにしたいのです。

こんな感じでやりたい
~中略~
// プロセス名取得
String pName = …;

// openofficeが起動しているかのチェック
if (pName.equals("")) {
    // openoffice起動
    ~中略~
// 処理を一旦停止    
    Thread.sleep(60000);
}

// コネクト接続処理
~中略~

// 変換処理
~中略~


補足
何故プロセスIDではないかというと、ネットで調べたら固定ではなく、毎回変動するようなので名前がいいなーと思いました。
もし、変動ではなく固定にすることが出来るなら、IDも可能です。

どなたか分かる方、ご教授頂けましたら幸いです。

A 回答 (3件)

import java.io.BufferedReader;


import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class ProcessGetter {
//プロセス表示コマンド(Windows)
//mainで使うために、やむを得ずのstatic
private final static String PS_COMMAND = "tasklist";

//ProcessBuilderにプロセス表示コマンド登録
//mainで使うために、やむを得ずのstatic
private final static ProcessBuilder psbuilder = new ProcessBuilder(PS_COMMAND);

//mainで使うために、やむを得ずのstatic
private final static List<String> list = new ArrayList<String>();

/*
* 実行中のプロセスを返す
*/
public static List<String> getProcess(){

try {
//コマンド実行
Process p = psbuilder.start();

//コマンドのコンソール表示を受け取る
BufferedReader bufreader = new BufferedReader
(new InputStreamReader(p.getInputStream()));
//ArrayListに突っ込みまくる
while (true) {
String tasks = bufreader.readLine();
list.add(tasks);

//コマンドライン表示終了時にストリームをクローズ
int c = p.getInputStream().read();
if (c == -1) {
p.getInputStream().close();
break;
}
}

return list;

} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}finally{
return list;
}
}


public static void main(String[] args) {

List<String> pslist = getProcess();
for(String str : pslist)
{
System.out.println(str);
}
}
}
    • good
    • 0
この回答へのお礼

回答ありがとう御座います。

せっかくサンプルソースを頂いたのですが、リーダに「変な事するな」といわれてしまいました・・・。

また別の機会に試してみたいと思います。

お礼日時:2010/05/17 09:32

長くなったので分けました



下記に投稿したコードを実行すると、

?C???[?W?? PID ?Z?b?V?????? ?Z?b?V????# ???????g?p??
========================= ======================= =========== ============
ystem Idle Process △△△△△ 0 △Services △△△△△ 0△△△△△△ 24 K
ystem △△△△△ 4△ Services △△△△△ 0 △△△△△△ 5,176 K
mss.exe △△△△△ 456 △Services△△△△△0△△△△△△752 K

↑の実行結果が得られます。(△はスペース)
※文字化け&プロセス名が欠けちゃってますね・・・
 実際に使うのであれば、申し訳ありませんが、自力で何とかして下さい。

Unix/Linuxの場合はPS_COMMANDに"ps"を指定して下さい。

あとはsplitするなりなんなりすれば、プロセス名が取得できると思います。


酔った頭でテキトーに書いたサンプルコードですので、
まともに動かなくてもご了承の程お願い致します。
    • good
    • 0

外部プログラムを経由して取得する方法しか知らないわ。


C#とかで取得したものをJavaに渡すといいわ。
VBScriptでもできたかも?


ところで気になったのだけど
実行時にopenofficeが起動していなくても
実行中にopenofficeが起動したらどうなっちゃうのかしら。
    • good
    • 0
この回答へのお礼

回答ありがとう御座います。

外部プログラムですか・・・。

>実行時にopenofficeが起動していなくても
>実行中にopenofficeが起動したらどうなっちゃうのかしら。

これって、どういう事ですかね?
待機させてる間に起動しきれず、次の処理実行中にopenofficeが起動したらってことですかね・・・

上記仮説だとして回答します。
待機させた後に、openofficeのコネクタを接続し、コンバータを取得します。
起動しきれない=コネクタ接続できない為、エラーで処理が異常終了するようにしてます。
起動しきれない=待機時間が短いって事だと思うので、設定ファイルの待機時間を増やして再実行(ユーザが)という形を取りました。
こういう感じにって指示を頂いたので。(リーダから)

お礼日時:2010/05/14 12:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!