我有一个shell脚本,它在opensuse linux下运行,启动一个java应用程序(在jar下),脚本是:
#!/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 :(得分:3)
将进程ID存储在文件中:
java ...blabla... &
echo $! > MyApp.pid
然后你可以用kill -TERM $(cat MyApp.pid)
杀死JVM。
或者,您可以使用jps
列出系统上的java进程。它列出了用于启动应用程序的进程ID和mainclass或jar文件,这可能足以识别您的应用程序。例如:
$ jps
20168 MyAPp
20186 Jps
$ kill -TERM 20168
有关jps
的更多信息:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
答案 1 :(得分:2)
将背景应用的PID写入有用的地方。
echo $! > /var/lib/MyApp.pid
然后在你的其他脚本中杀死那个PID。
答案 2 :(得分:0)
使用ps xa
时,您可以获取正在运行的进程列表,包括用于启动它的完整命令。如果您不想像其他人提到的那样使用临时文件,您可以使用grep for java以及您的类或jar名称。
ps xa | grep java | grep com.package.MyApp | xargs kill -15