- PR -

別マシンのプロセスをkillする方法

1
投稿者投稿内容
kon
会議室デビュー日: 2003/06/18
投稿数: 3
投稿日時: 2003-08-06 19:52
初めて投稿します。
いつも参考にさせていただいております。

Windows2000上でJavaのアプリケーションを作っている
のですが、別マシン(Linux)のプロセスをkillする方法
がわからず困っています。

java.lang.Runtime.execメソッドを使うと、
実行されたマシン上で killコマンドが実行されてしまい
期待する動作は得られませんでした。
以下にコードを一部抜粋します。

 String[] cmd = {"kill", "-9", PID};
 try{
  process p = Runtime.getRuntime().exec(cmd);
  p.waitFor();
  p.destroy();
 } catch(Exception e) {
  e.printStackTrace();
 }

別のマシン上でコマンドを実行する方法はないものでしょうか。

#的外れな質問でしたらスミマセン
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-08-07 10:17
Javaとか何とか言う前にそれができたら何ができるか(何をされてしまうか)考えてみてください。
それをわかった上で、通常そういう場合にどうするかを考えてみてください。

当たり前ですがjava.lang.Runtimeはローカルのプロセスしか扱えません。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-08-07 10:44
既にレスがついていますが、Javaだからどうとかいうことでなく、Linuxマシン上で
稼動するプロセスをリモートホストからkillする方法は標準では存在しないと
思います。
ご自分でプロセスをkillするサーバを作成してLinux上で稼動させ、それに対して
リモートのJavaプログラムから接続する、という形になると思います。
しかしこれは非常に危険ですので、そもそもLinux上ののプロセスをリモートから
killしなければいけないのかどうか、もう一度良く考えたほうが良いですよ。
kon
会議室デビュー日: 2003/06/18
投稿数: 3
投稿日時: 2003-08-07 13:27
少し説明が足りなかったかもしれないので、補足しておきます。
悪意があって他のマシンのプロセスをkillしようと思っている
わけではございません^^;(念のため)
しかし、execメソッドにはセキュリティホールもあり危険である
ことも投稿をした後で気づきました。
http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole02.html

別のマシンのプロセスをkillしたい理由は、以下の仕様による
ものです。

DB(Oracle)の複数インスタンスのスループットをグラフでモニタ
リングするアプリケーションを作成しているのですが、[ABORT]
ボタンで、バックグラウンドプロセスを停止するという処理を行
なうためです。

おばけさんがおっしゃる方法、各ホストにあらかじめインスタ
ンスをABORTする(=プロセスをkillする)デーモンを作成して
起動させておき、要求に応じてそのデーモンがプロセスをkill
することは考えておりました。

他にもっと簡単な方法があるのではないか、と思ったのですが
やはりないようですね。。

ご助言、ありがとうございました。
san12
常連さん
会議室デビュー日: 2003/06/19
投稿数: 26
投稿日時: 2003-08-07 14:20
引用:

konさんの書き込み (2003-08-07 13:27) より:
少し説明が足りなかったかもしれないので、補足しておきます。
悪意があって他のマシンのプロセスをkillしようと思っている
わけではございません^^;(念のため)
しかし、execメソッドにはセキュリティホールもあり危険である
ことも投稿をした後で気づきました。
http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole02.html

別のマシンのプロセスをkillしたい理由は、以下の仕様による
ものです。

DB(Oracle)の複数インスタンスのスループットをグラフでモニタ
リングするアプリケーションを作成しているのですが、[ABORT]
ボタンで、バックグラウンドプロセスを停止するという処理を行
なうためです。

おばけさんがおっしゃる方法、各ホストにあらかじめインスタ
ンスをABORTする(=プロセスをkillする)デーモンを作成して
起動させておき、要求に応じてそのデーモンがプロセスをkill
することは考えておりました。

他にもっと簡単な方法があるのではないか、と思ったのですが
やはりないようですね。。

ご助言、ありがとうございました。



あるはずでしょう。。。。(爆笑
SSHとかリモートシェルとか、RPCとか。
#Javaの体系から外れますが。

それをJavaから呼び込む方法を考えれば済む筈。
しかも、見ただけで新人レベルでも可能な複数の方法が
浮かぶんですが...

周りのシニアクラスのエンジニアにご相談を奨めます。
さもないと、組織として"恥じ"でしょう!?
kon
会議室デビュー日: 2003/06/18
投稿数: 3
投稿日時: 2003-08-08 11:24
http://javatelnet.org/
にあるパッケージを使用することで解決しましたので
以下に報告しておきます。

テスト用コードを載せておきますので見ていただければ
わかると思いますが、非常に簡単に実現できました。

コード:

package test;

import java.net.*;
import java.io.*;
import de.mud.telnet.*;

public class TelnetClient
{
static final int TELNET_PORT = 23;

public static void main(String[] args)
{
try {
TelnetClient tc = new TelnetClient();
tc.clientMain(args);
} catch(Exception e) {
e.printStackTrace();
}
}

public void clientMain(String[] args) throws Exception
{
checkArgs(args);
TelnetWrapper telnet = new TelnetWrapper();
String hostname = args[0];
String username = args[1];
String password = args[2];
String prompt = args[3];
String command = args[4];
try {
telnet.connect(hostname, TELNET_PORT);
telnet.login(username, password);
telnet.setPrompt(prompt);
telnet.waitfor(prompt);
System.out.println( telnet.send(command) );
telnet.disconnect();
} catch(java.io.IOException e) {
e.printStackTrace();
}
}

public void checkArgs(String[] args)
{
if(args.length != 5)
{
print("Usage: java -jar telnetclient.jar <host> <user> <passwd> <prompt> <command>");
System.exit(0);
}
}

public void print(String str)
{
System.out.println(str);
}
}



[ メッセージ編集済み 編集者: kon 編集日時 2003-08-21 13:24 ]
san12
常連さん
会議室デビュー日: 2003/06/19
投稿数: 26
投稿日時: 2003-08-08 15:06
引用:

konさんの書き込み (2003-08-08 11:24) より:
http://javatelnet.org/
にあるパッケージを使用することで解決しましたので
以下に報告しておきます。

テスト用コードを載せておきますので見ていただければ
わかると思いますが、非常に簡単に実現できました。


telnetのパターンを利用したんですね。
ピュアなJavaの流儀からは、やや逸脱ですが良かったですね。
#頑張ってください。
1

スキルアップ/キャリアアップ(JOB@IT)