【问题标题】:Shell script to stop a java program用于停止 Java 程序的 Shell 脚本
【发布时间】:2023-12-11 03:29:01
【问题描述】:

有没有办法通过只知道名称来停止使用 shell 脚本运行的 java 程序。我正在使用 ksh shell

【问题讨论】:

  • 知道什么名字?如果您知道可执行文件的名称(通常是 java),killall 就是您的朋友。
  • @sfussenegger:可能他不想杀死所有的 java 进程,而只想杀死一个特定的。
  • @Mnementh 这也是我所期望的,但从给定的信息来看,这是我能推荐的最好的东西。
  • 如果您试图杀死的进程打算作为守护进程运行,您可能还想查看 start-stop-daemon

标签: java shell ksh


【解决方案1】:

跟进Mnementh' suggestion

这应该可以完成工作

jps -l | grep org.example.MyMain | cut -d ' ' -f 1 | xargs -rn1 kill
  • jps -l: 使用“应用程序主类的完整包名或应用程序 JAR 文件的完整路径名”列出 java 进程。

  • grep:选择你喜欢的流程

  • cut -d -' ' -f 1:使用分隔符 '' 将输出拆分为列并仅打印第一个(pid)

  • xargs -rn1 kill:对每个PID执行kill(如果有的话)

请注意,在运行进程时,您必须使用相同的用户(或 root)运行 jps 和 xargs

【讨论】:

  • 这也适用于 Windows 机器,但您需要进行一些环境检测以确定使用哪个 kill
  • @Odelya 我刚刚将-r (--no-run-if-empty) 添加到xargs 以避免此错误。
【解决方案2】:

您可以使用 ps 的 -o 选项来格式化输出,

ps -eo cmd,pid | awk '!/awk/&&/mycommand/{cmd="kill -9 "$2;system(cmd)}'

【讨论】:

    【解决方案3】:

    你可以使用 pkill:

    pkill your_java_program_name
    

    如果您只运行正在运行的程序的一个实例,这将起作用。

    【讨论】:

      【解决方案4】:

      向 JVM 添加一个唯一属性以轻松识别它,例如对于 test.class

      java -Duniquename=1 test
      

      杀死它:

      ps ax | grep uniquename | grep -v grep | awk '{print $1}' | xargs kill
      

      【讨论】:

      • 在 KSH 下运行良好。也许你在复制命令时出错了。
      • 'grep [u]niquename' 是 'grep uniquename | 的替代品。 grep -v grep'
      【解决方案5】:

      您可以使用 jps 标识与已启动的 java 程序名称相关联的进程 ID(jps 是 java 程序的进程管理器)。有了这个id就可以正常终止进程了。

      【讨论】:

      • 假设我的java文件名是test.java并且正在运行如何找到它?
      • @Harish:编译并执行后将显示为“测试”。如果将其打包在可执行 jar (test.jar) 中并通过“java -jar test.jar”执行 jps 显示“test.jar”。