如何在shell脚本中杀死刚刚启动的Java进程?



我有这个简单的脚本,我在其中执行一个.jar文件,我需要它的PID来在sleep命令之后杀死它:

java -jar test.jar &> output.txt & pid=$! sleep 10

问题是:PID在应用程序完全启动后发生变化,我首先得到的这个PID与应用程序在10秒睡眠后的PID不同(我使用ps检查了它)。

我如何跟踪PID以便我可以终止完全启动的应用程序?

我试过使用pstree -p $pid,但我得到了一长串Java子进程,我认为可能有更好的方法来实现这个,而不是得到每个子进程,使用grep提取PID并杀死它,也因为我不是100%确定这是工作。

我找到了使用jps的另一个解决方案,但我更喜欢使用本地linux命令来兼容。

我不一定需要PID,使用进程名可能是一种方法,但我不知道如何检索,要么只有父进程的PID。

如果您想使用进程名,可以运行:

$ kill -9 $(ps aux | grep '[t]est.jar' | awk '{print $2}')

选项细节:

  • kill:发送kill信号(SIGTERM 15: Termination),优雅地终止任何进程。
  • kill -9:发送kill信号(SIGTERM 9:Kill)立即终止任何进程
  • ps:列出所有进程。
  • grep:过滤,[p]防止实际grep进程显示在ps结果中。
  • awk:给出每行的第二个字段,即PID。(ps输出:$1:user, $2:pid…)

两种方式

  1. 使用系统。退出()内置函数。

  1. 将pid号重定向到一个文件,稍后使用该文件终止进程。

交货:-

java -jar test.jar &> output.txt & echo $! > pid-logs
cat pid-logs | xargs kill -9

最新更新