【问题标题】:Getting PID of a process that has just started获取刚刚启动的进程的PID
【发布时间】:2017-07-17 08:46:59
【问题描述】:

我正在开发一个 Gradle Java 项目。这会启动 Tomcat 进行测试并稍后停止。 当测试失败时,我应该杀死这个 Tomcat 实例。 我尝试使用“ps aux| grep tomcat | grep -v grap | awk {print $2}”命令来获取进程 ID 并终止进程。 但是在Production上,会有很多用户同时运行这么多Tomcat进程,我只想让我的build.gradle启动的tomcat进程用于测试执行。 那么我怎样才能完成任务呢?请给我一些指导。

【问题讨论】:

  • 您能否分享在production 环境中执行测试的意图?通常,unit testsintegration tests 应在您的 ci 环境中执行并将构建工件部署到您的环境(devqaproduction)。
  • 您真的需要启动 Tomcat 进行测试吗?如果在过程中完成,测试可能更容易实施且更具确定性。
  • Andreas,我正在处理现有项目。这里的测试执行需要Tomcat。

标签: java shell tomcat gradle process


【解决方案1】:

您需要在“ps aux”的输出中找到一个唯一的字符串,以区分您的测试 tomcat 和其他人。

我目前使用以下脚本先运行“shutdown.sh”,然后杀死 PID,因为大多数情况下,应用程序会停止但进程不会停止。

PID=`ps -ef | grep $JAVA_HOME/bin/java | grep "$TOMCAT_LOC"/conf | grep -v grep | awk '{ print $2 }'`

if [ $PID ]; then

echo tomcat is running with PID:$PID.

# Stop or Kill running Tomcat
if [[ -f $TOMCAT_LOC/bin/shutdown.sh ]]; then
    [[ ! -x $TOMCAT_LOC/bin/shutdown.sh ]] && chmod a+x $TOMCAT_LOC/bin/shutdown.sh
    $TOMCAT_LOC/bin/shutdown.sh  >>/dev/null
    sleep 20
fi    
    kill -9 $PID
    sleep 3
else
    echo tomcat is not running
fi

您还可以通过编辑“catalina.sh”来配置 PID 文件,稍后您可以阅读该文件以找出您的 PID。

#   CATALINA_PID    (Optional) Path of the file which should contains the pid
#                   of the catalina startup java process, when start (fork) is
#                   used

【讨论】:

    【解决方案2】:

    终止 Tomcat 实例的正确方法是通过它自己的shutdown 命令。您根本不应该考虑进程、PID 或终止。

    【讨论】:

      【解决方案3】:

      因此,如果您想从您登录的那个用户那里杀死 tomcat,请尝试关注并告诉我这是否对您有帮助。

      ps -ef | grep -v grep | grep `whoami` | grep tomcat 
      

      所以通过 ps -ef 我列出所有进程然后 grep -v grep 将删除 grep 命令的进程然后 grep whoami 将查找您当前登录的用户然后 grep tomcat 将仅查找 tomcat 进程,测试它一次,如果一切都好,那么你可以杀死它。

      顺便问一下tomcat停止脚本怎么样?如果它在那里,你也可以使用它。

      【讨论】:

      • Tomcat 停止脚本有时会失败。所以,这就是我不采用这种方法的原因。
      • 很好,你可以试试上面的命令,如果对你有帮助,请告诉我。
      • 上述方案会杀死用户运行的所有Tomcat进程。我只想杀死一个开始测试的人。所以,如果我们可以在启动tomcat进程的时候捕获pid,然后用这个id去kill。那会更容易接受。
      • 好的,现在我要问您的下一个问题是,您是如何开始“测试”tomcat 进行测试的?我的意思是会有一些方法来区分所有的tomcat,对吧?因此,如果 tomcat 的名称不同,那么您也可以找到它们。我也怀疑你是否有一个tomcat和不同的虚拟机,如果我在这里错了,请纠正我。
      • 在 jenkins 上运行 grep 'whoami' 将不起作用。它会导致其他问题。
      【解决方案4】:

      Java JRE 在$JAVA_HOME/bin 文件夹中有一个名为jps 的工具。 它类似于 unix ps 命令,但仅适用于 java。 您可以使用它来确定您需要的 exac java 进程。 更推荐使用此工具,实际上它更有用,当您的主机上运行多个 Java 应用程序时...

      例如,我运行了 h2 数据库和许多其他应用程序,但只想杀死 h2,所以我可以使用 jps 获取它的 PID

      $ jps
      17810 GradleDaemon
      17798 GradleWrapperMain
      17816 h2-1.4.197.jar
      17817 GradleDaemon
      17818 GradleDaemon
      18011 Jps
      16479 
      

      然后杀死需要的进程:

      kill -9 17816
      

      所有其他 java 应用程序将继续正常工作。我不确定tomcat,但我认为它可以以类似的方式完成,就像这样:

      kill -9 $(jps | grep tomcat | awk '{print $1}')
      

      最后,有点离题,但特别适合您的情况:正确的方法是使用 tomcat 提供的启动/停止/重启脚本

      【讨论】:

        【解决方案5】:

        您可以使用 shell 变量$!。它表示最近的后台命令的 PID。

        yourCommand &

        CMD_PID=$!

        echo $CMD_PID

        【讨论】:

        • AFAIS 进程从 java 开始。顺便说一句yourCommand & echo $! 更简单
        • Tomcat的启动命令是一个启动Java进程的脚本。 $! 只会给你运行脚本的消逝命令处理器的 PID。
        猜你喜欢
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2014-11-17
        • 2015-05-05
        • 2016-05-11
        • 1970-01-01
        相关资源
        最近更新 更多