【问题标题】:Stop Java Process if Running in Raspbian如果在 Raspbian 中运行,则停止 Java 进程
【发布时间】:2015-06-03 09:13:33
【问题描述】:

我想确保 Raspbian 中的 java 进程在启动它的新实例之前停止。

到目前为止,我的方法一直是尝试创建一个单行命令来从命令行停止进程,因为这是在 GO 连续交付工具中包含此步骤的最简单方法。到目前为止,我想出了这个解决方案,它有效地停止了这个过程:

kill $(jps -m | grep NameOfTheMainClass | awk '{print $1}')

但是问题是,当进程没有启动时,kill 失败,因为它没有 pid 来发出信号。我该如何解决?

【问题讨论】:

  • @SubOptimal java进程的问题在于,从操作系统的角度来看,它们都被命名为“java”,因此我不能pidof NameOfTheMainClass
  • 你为什么不用ps ax | grep NameOfTheMainClass
  • 使用一个小的 bash 脚本来检查它是否运行,然后像你一样杀死它。
  • @SimonZambrovski ps ax 显示在结果中

标签: java command-line-interface raspbian application-shutdown


【解决方案1】:

如果你喜欢单线

JPID=$(jps -m | grep NameOfTheMainClass  | awk '{print $1}') && [ -z "$JPID" ] || kill $JPID

【讨论】:

    【解决方案2】:

    试着让它有条件:

    export MAIN_CLASSNAME=""
    
    isRunning()
    {
      PID=`ps ax | grep MAIN_CLASSNAME | grep -v grep | awk '{print $1}'`
      is_running="false"
      if [ ! -z "$PID" ]; then
        is_running="true"
      fi
      test "$is_running" = "true"
    }
    
    if isRunning; then
      kill $PID       
    fi
    

    【讨论】:

    • 小心这个。正如我所说,ps ax 会出现,你最终会杀死ps
    • ps ax | grep foo 将显示 grep 而不是 ps ax。为避免这种情况,您通常通过添加来排除 grep:ps ax | grep MAIN_CLASSNAME | grep -v grep | awk '{print $1}'