如何使用shell脚本

如何使用shell脚本

问题描述:

我有一个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

写转到后台应用程序的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

存放在一个文件中的进程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

当您使用ps xa你可以得到正在运行的进程,包括用于启动它的完整的命令列表。如果你不想像其他人提到的那样使用临时文件,你可以grep for java以及你的类或jar名称。

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