2012-03-29 107 views
1

我有一個shell腳本,這是一個的openSUSE Linux下運行,啓動Java應用程序(一個罐子下),腳本阻止Java應用程序:如何使用shell腳本

#!/bin/sh 

#export JAVA_HOME=/usr/local/java 
#PATH=/usr/local/java/bin:${PATH} 

#---------------------------------# 
# dynamically build the classpath # 
#---------------------------------# 
THE_CLASSPATH= 
for i in `ls ./lib/*.jar` 
do 
    THE_CLASSPATH=${THE_CLASSPATH}:${i} 
done 

#---------------------------# 
# run the application # 
#---------------------------# 
java -server -Xms512M -Xmx1G -cp ".:${THE_CLASSPATH}" com.package.MyApp > myApp.out 2>&0 & 

這個腳本工作正常。

現在,我想要的是編寫一個腳本來優雅地殺死這個應用程序,這使得我可以用Linux kill命令中的-15參數殺死它。

問題是,這個服務器上會運行很多java應用程序,所以我需要專門殺死這個。

任何幫助?

由於提前,

費爾南多

+0

請注意您的問題,但是您可以/應該將您的應用程序放入jar中,並在其清單文件中通過相對路徑提及所有庫。請參閱:http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html – Dave 2012-03-29 23:24:42

回答

2

寫轉到後臺應用程序的PID某處有用。

echo $! > /var/lib/MyApp.pid 

然後殺死你的其他腳本中的PID。

+0

謝謝@ ignacio-vazquez-abrams,答案的其餘部分在此處找到: http://stackoverflow.com/問題/ 8884480 /開始和結束 - java-app-with-shell-script-debian – 2012-03-30 17:04:23

3

存放在一個文件中的進程ID:

java ...blabla... & 
echo $! > MyApp.pid 

然後你就可以用kill -TERM $(cat MyApp.pid)取消JVM。

或者,您可以使用jps列出系統上的java進程。它列出了用於啓動應用程序的進程ID和主類或jar文件,這可能足以識別您的應用程序。例如:

$ jps 
20168 MyAPp 
20186 Jps 
$ kill -TERM 20168 

更多信息上jpshttp://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html

+0

謝謝@Joni Salonen,但我不能使用jps。不過,這非常有幫助。 – 2012-03-30 17:01:51

0

當您使用ps xa你可以得到正在運行的進程,包括用於啓動它的完整的命令列表。如果你不想像其他人提到的那樣使用臨時文件,你可以grep for java以及你的類或jar名稱。

ps xa | grep java | grep com.package.MyApp | xargs kill -15