- PR -

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

投稿者投稿内容
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2006-02-01 22:47
引用:

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


クラスパスを絶対パス指定でかけばいいだけでは。。。
まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-02-01 23:17
>mogeさん、ありがとうございます。

#/usr/local/oldserver/j2sdk1.4.2_05/bin/java -cp /usr/local/cmd/cmdsock.jar:
/usr/local/cmd/log4j-1.2.12.jar /sock/age/Sock

とすればよいのでしょうか、、、

今すぐ自分で確認できないのがつらいですね、、、

あと、もうひとつ質問があります。

サーバ起動を行うコマンド/etc/init.d/oldserverd startの中で上記のjarファイルを実行できるように
したとします。

このjarファイルを実行すると無限ループに入って処理を続けているのですが、この実行中は
ほかのコマンドは打てないのですか?

つまり、

#/etc/init.d/oldserverd start

# ←と次のコマンドを打てる状態になるのでしょうか?

聞いてばかりで本当に申し訳ありませんが、よろしくお願いします
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-02-02 01:59
「通信エージェント」のテスト中で、次は「起動終了」コマンドですか。
#状況わかっちゃったよ(苦笑)

引用:

#/etc/init.d/oldserverd start
# ←と次のコマンドを打てる状態になるのでしょうか?



要するに「通信エージェントでの、Linuxの起動終了を実装してくれ」という要求に
見えます。それは無理があります。というのも「仕様」が分からんからです。

なぜ「仕様」が必要かというと、まきさんが適当に「起動終了」を実装したとしても、
「テスト」後に運用するわけでしょ。どういう形でも。

大抵の場合、実装した人は運用しません。だから何らかの形で、
ドキュメントなりを残すことになります。

ここらへんはちゃんと「仕様化」する必要があります。ということで完全に
「コーディング」の範疇を超えています。

どんな「仕様」でも大抵の場合、実装できますけど、そもそも「仕様」が
分からない限り、結局は実装したことになりません。

で、本来は、ここらへんを相談できる人員を配置するのが普通です。というのも、
あまりに製品(「通信エージェント」)の内容に依存しすぎていて、アドバイスできないのです。

でだ。どうせそんなやつは、いないだろうから(苦笑)
どういう「仕様」が正しいか。おそらく想定するに以下だろう。

1.シェルスクリプト(/etc/init.d/oldserverd)を作る。
2./etc/init.d/oldserverd start
or
stopして起動確認。
3.chkconfig --add oldserverd --level 35 としてLinuxに登録。

まぁ、ここらへんが基準です。

「/etc/init.d/oldserverd」の内容。
----
#!/bin/bash
#
# chkconfig: 2345 90 12
# description: Socket Agent
#
# SocketAgent Socket Agent

# Source function library.
. /etc/init.d/functions

PATH=$PATH:/usr/sbin
SERVER=/usr/java/bin/java
KILLER=killall
prog="java"

[ -f $SERVER ] || exit 0

start() {
echo -n $"Starting $prog: "
/usr/local/oldserver/j2sdk1.4.2_05/bin/java -cp /usr/local/cmd/cmdsock.jar:/usr/local/cmd/log4j-1.2.12.jar /sock/age/Sock
#ここで起動方法を記述する。それはみなさんの書いてある通り。
}

stop() {
action "Stopping $prog:" $KILLER 2> /dev/null
killall "java"
#ここで停止方法を記述する。同じくみなさんの書いてある通り。
}

case "$1" in
start)
start
;;
stop)
stop
;;
status)
status socketagent
;;
restart|reload)
stop
start
;;
condrestart)
if [ -f /var/lock/subsys/canna ]; then
stop
start
fi
;;
*)

esac

exit 0
-----

ちなみに細かいところが不完全です。要するにRed Hat系列のサービスの
登録を行います。/etc/init.dに入っているやつを参考にする方が正しいでしょう。

まぁ、こんぐらいキーワードと方針があれば出来るだろう(きっと)

だから、ちゃんと人員配置しろよ、、、、
でも、近年、できないのも良く知ってるのだが。。。。。。

まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-02-02 10:20
加納さん、ありがとうございます。

できなくてもやらなければダメなので、、、

みなさんのアドバイスから自分でシェルスクリプトを書いて実行してみました。

その結果ですが、
#/etc/init.d/newserverd start
としたとき、

次のコマンドを打てる状態になりませんでした。
というのは、実行したjarファイルは無限ループがあり、処理が終わらないためです。

なので、他にコマンドをうつにはCtrl+Cで強制終了しなければならない状態です。

やはりこの方法ではだめなのでしょうか?

ちなみにどのように書いたかというと
zillollさんが教えてくださったように
start時:
jarファイルの実行
MYPID=$!
echo $MYPID > /tmp/my.pid

stop時:
kill -9 'cat/tmp/my.pid
rm /tmp/my.pid
です。

たぶん、start時はjarファイルの実行のところでとまっていると思います。

どなたかいい方法ありましたら教えてください。よろしくお願いします
zilloll
常連さん
会議室デビュー日: 2006/02/01
投稿数: 24
投稿日時: 2006-02-02 10:44
Java実行コマンドの最後に & をつけてバックグラウンドでの
実行にしないと処理のステップが移らないと思います。

[ メッセージ編集済み 編集者: zilloll 編集日時 2006-02-02 12:04 ]
まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-02-02 13:38
> zillollさん
 ありがとうございます。

&を入れたらできました。

newserverdは

start)
/usr/local/oldserverd/httpd $1
/usr/local/oldserverd/tomcatd $1
jarファイルの実行&
プロセスIDの保存
stop)
kill処理(またはkillall java)
/usr/local/oldserverd/httpd $1
/usr/local/oldserverd/tomcatd $1

restart)
kill処理
/usr/local/oldserverd/httpd $1
/usr/local/oldserverd/tomcatd $1
jarファイルの実行&
プロセスIDの保存

としました。そうすると、start,stopをうつとうまくいきます。
ただ、restartをすると

Catalina.stop: java.net.ConnectException: Connection refused
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:452)
at java.net.Socket.connect(Socket.java:402)
at java.net.Socket.<init>(Socket.java:309)
at java.net.Socket.<init>(Socket.java:124)
at org.apache.catalina.startup.Catalina.stop(Catalina.java:581)
at org.apache.catalina.startup.Catalina.execute(Catalina.java:402)
at org.apache.catalina.startup.Catalina.process(Catalina.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:203)

というエラーが表示されます。このエラーを検索してみたら、Tomcatの起動(停止?)がうまく
いってないから出るエラーみたいなのですが。

どなたかこのエラーが出て対処された方はいらっしゃいますか?いらしたら教えていただきたいです。
よろしくお願いします。
zilloll
常連さん
会議室デビュー日: 2006/02/01
投稿数: 24
投稿日時: 2006-02-02 14:29
tomcatには詳しくないのですが、
restartの際、コマンドを一度しか実行していませんが、
パラメータ"restart"などで、一度で停止と起動が
でるのでしょうか。

[ メッセージ編集済み 編集者: zilloll 編集日時 2006-02-02 14:39 ]
まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-02-03 09:49
>みなさま

ご親切にご教授くださってありがとうございます。やっとできました。

/etc/init.d/newserverd を

start)
/usr/local/oldserver/bin/httpd $1
/usr/local/oldserver/bin/tomcatd $1
jarファイルの実行&
c

stop)
kill `cat /tmp/new.pid
rm /tmp/new.pid
/usr/local/oldserver/bin/httpd $1
/usr/local/oldserver/bin/tomcatd $1

restart)
kill `cat /tmp/new.pid
rm /tmp/new.pid
/usr/local/oldserver/bin/httpd $1
/usr/local/oldserver/bin/tomcatd $1
sleep 5
jarファイルの実行&
PID=$!
echo $PID > /tmp/new.pid

としたらrestart時もエラーがでなくなりました。

貴重なアドバイス本当にありがとうございました。




stop)

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