- PR -

Linuxでのjavaアプリケーション強制終了コマンドについて

投稿者投稿内容
まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-02-01 17:41
Linux&Java初心者です。
Linuxで教えてもらいたいことがあります。

Linux上であるサーバを起動する際にjavaアプリケーション(jarファイルに固めてある)を実行します。

そのjavaアプリケーションは指示をしないと永久に処理を続けるものです。(ループを抜けない仕組みに
なっているので)

そしてそれをサーバを停止する際に強制終了させたいのですが、やり方がわかりません。

サーバの起動・停止時に行う処理などはシェルファイルに書いています。

たとえば普通にjavaアプリケーションを実行した場合はCtrl + Cで強制終了できるのですが、
それと同じことをコマンドで指示したいと思っています。

しかし、killコマンドの場合はプロセスIDが毎回変わるため指定できないため、使えません。

どなたかいい方法があればご教授ください。よろしくお願いします。


Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2006-02-01 18:02
いわゆる daemon として動作するようなプログラムのようですね。

/etc/init.d の下に同じような動作をするプログラムの
起動・停止スクリプトがあるので参考になると思います。

いろいろな書き方があるようですが、基本的に以下の動作をしています。
(1)起動時にプロセス番号をファイルに書いておく
(2)ファイルに書かれたプロセス番号を kill の引数にする

/etc/init.d/functions の中にも便利なスクリプト関数があるので
利用すると簡単かもしれません。
まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-02-01 18:16
Java僧さん

アドバイスありがとうございます。

私は、javaを数ヶ月やっただけの初心者で、、、シェルとか、その中にかかれている言語とかもぜんぜん分からないのですが、参考になるサイトなどありますか?

おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2006-02-01 19:01
終了スクリプトが用意されていないjavaアプリの場合は、

killall java

で全部のjavaのプロセスを終了させるとかしてます。
全部のプロセスが終了してしまうので、
java アプリが複数動作していた場合は、注意が必要です。
zilloll
常連さん
会議室デビュー日: 2006/02/01
投稿数: 24
投稿日時: 2006-02-01 19:05
googleで”シェルスクリプト”で検索すると
おすすめかはわかりませんが、文法の説明や
コマンドの説明をしているサイトなど、いろいろありそうです。

さて、強制終了ですが、シェルで起動・停止しているのであれば、
以下のように実現できると思います。

----start.sh------
#!/bin/sh
java -classpath . MyTest &
MYPID=$!
echo $MYPID > my.pid


----stop.sh-------
#!/bin/sh
kill -9 `cat my.pid`
rm my.pid
けそらそら
会議室デビュー日: 2005/12/19
投稿数: 12
お住まい・勤務地: 高円寺に住みたい
投稿日時: 2006-02-01 19:08
私は、特定のポートに特定のコマンドが送られたら終了するようにしています。
もちろん送信元がローカルホストのみ終了する感じで。
anights
ぬし
会議室デビュー日: 2003/05/22
投稿数: 277
お住まい・勤務地: 東京
投稿日時: 2006-02-01 19:13
引用:

まきさんの書き込み (2006-02-01 17:41) より:
しかし、killコマンドの場合はプロセスIDが毎回変わるため指定できないため、
使えません。



みなさん、書かれているように方法は色々ありますが。。。
プロセスIDが毎回変わるならそれを特定すればいいだけのことです。
使われているディストリビューションがなにか分かりませんが
最近のディストリビューションにはpkill(pgrep)コマンドというのがあります。
(最近のRedHatならprocpsパッケージに入っています)

全体のプロセス状態が分かりませんが
# pkill -f hogehoge.jar
などで大抵はkill出来るかと思います。
オプションの意味は
# man pkill で調べて下さい。
オプションをうまく組み合わせればまず他のプロセスを巻き込まずに
kill 出来ると思います。
まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-02-01 22:05
>アドバイスくださっているみなさま

ありがとうございます。

今みなさんが教えてくれたことを理解するために調べています。ただ、実行環境が今ないので確認でき
ないのですが(なのに期限が明日)、、、

調べていて、分からないことがあるのでまた教えていただきたいと思うのですが、

まず、私が行うところにある環境ですが、
・RedHatLinuxを使用
・実行するjava(jarファイル)のパスは/usr/local/cmd/
・実行するjarファイルの名前はcmdsock.jar
・単独で実行する際にうっているコマンドは、カレントディレクトリを/usr/local/cmdにして
#/usr/local/oldserver/j2sdk1.4.2_05/bin/java -cp cmdsock.jar:log4j-1.2.12.jar /sock/age/Sock
(Sock.classを実行します)
・サーバの起動・停止を行うためのコマンドは/etc/init.d/newserverd start(stop)
・newserverdのパスは/etc/init.d

です。

newserverdのなかにjarファイルの実行を指示するときにどのように書いたらよいですか?
カレントディレクトリが違うと実行できないのですが、どうしていいか分からないです。

確認できないので聞いてばかりになりますが教えてください。よろしくお願いします。


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