【问题标题】:I would like to find the process id of a Jenkins job我想查找 Jenkins 工作的进程 ID
【发布时间】:2016-04-25 18:54:44
【问题描述】:

我想找到一种方法来查找 Jenkins 作业的进程 ID,以便在作业挂起时终止该进程。 Jenkins 实例位于 Ubuntu 上。有时,我们无法通过 Jenkins 界面停止工作。如果我运行包含简单 shell 脚本的 Jenkins 作业,我可以通过终止进程 id 来停止作业,在该脚本中我手动收集进程 id,例如:

#!/bin/bash
echo "Process ID: $$"
for i in {1..10000}
do
   sleep 10;
   echo "Welcome $i times"
done

在命令外壳中,我可以运行sudo kill -9 [process id],它成功地终止了工作。

问题是,我们的大多数工作都有多个构建步骤,并且我们有多个项目在此服务器上运行。我们的许多构建步骤是 shell 脚本、windows 批处理文件,其中一些是 ant 脚本。我想知道如何找到 Jenkins 作业的进程 ID,它是所有构建步骤的父进程。截至目前,我必须等到所有其他构建完成并重新启动服务器。感谢您的帮助!

【问题讨论】:

  • 嗨@gXg,感谢您的帮助。我运行了ps -ef| grep jenkins,它帮助我找到了正在运行的 Jenkins 进程。问题在于它显示了所有正在运行的 Jenkins 进程。这并没有按正在运行的作业的名称列出它们,在我的例子中,它是一个自动生成的 shell 脚本。经过进一步调查,我确定杀死父进程杀死了 Jenkins,因此我可能需要确定另一种方法来执行此操作。
  • 如果我可以在执行过程中将 BUILD_ID 和 JOB_NAME 附加到自动生成的 shell 脚本名称中,那么我想我应该能够找到确切的进程并杀死它。我不确定如何做到这一点。 (例如,这是我希望能够搜索并杀死的进程信息:jenkins 3053 1831 0 10:59 ? 00:00:00 /bin/bash /tmp/hudson998677067093515957.sh )

标签: bash shell ubuntu jenkins


【解决方案1】:

在 *nix OS 上,您可以通过调查 /proc/$pid/environ 来查看正在运行的进程的环境变量,并查找 Jenkins 特定变量,例如 BUILD_IDBUILD_URL 等。

cat /proc/'$pid'/environ | grep BUILD_URL

你可以知道你$pid 或通过正在运行的进程。

【讨论】:

  • 谢谢@luka5z,我挖了出来,这是输出:现在我只需要编写脚本,这样我就可以针对所有正在运行的进程运行它。我想如果我能做到这一点,我应该能够找到并杀死正确的进程。 (输出显示在下一篇文章中)
  • kevin@ubuntu01x64:/proc/10335$ sudo cat environ TERM=linuxJENKINS_HOME=/var/lib/jenkinsSHLVL=1ROOT_BUILD_CAUSE=MANUALTRIGGERNODE_LABELS=masterMAIL=/var/mail/jenkinsPWD=/var/lib/jenkinsQT_QPA_PLATFORMTHEME =appmenu-qt5BUILD_ID=7BUILD_CAUSE=MANUALTRIGGERLOGNAME=jenkinsBUILD_TAG=jenkins-Wait_Job_2-7_=/usr/bin/daemonNODE_NAME=masterBUILD_NUMBER=7 b>EXECUTOR_NUMBER=0SHELL=/bin/bash ...(为简洁起见删除了字符)HUDSON_HOME=/var/lib/jenkinsXDG_SESSION_ID=c2XDG_RUNTIME_DIR=/run/user/116LANG=en_US.UTF-8
【解决方案2】:

这是对我的问题的更新。为了杀死挂起的(僵尸)作业,我相信这仅适用于 Jenkins 从与其作业相同的服务器运行的情况。如果您试图杀死在 Jenkins slave 上运行的挂起进程,我怀疑这会起作用。

#FIND THE PROCESS ID BASED ON JENKINS JOB
user@ubuntu01x64:~$ sudo egrep -l -i 'BUILD_TAG=jenkins-Wait_Job-11' /proc/*/environ
/proc/5222/environ
/proc/6173/environ
/proc/self/environ


# ONE OF THE PROCESSES LISTED FROM THE EGREP OUTPUT IS THE 'EGREP'COMMAND ITSELF, 
# ENSURE THAT (LOOP THROUGH) THE PROCESS ID'S TO DETERMINE WHICH IS
# STILL RUNNING
user@ubuntu01x64:~$ if [[ -e /proc/6173 ]]; then echo "yes"; fi 
user@ubuntu01x64:~$ if [[ -e /proc/5222 ]]; then echo "yes"; fi 
yes

# KILL THE PROCESS
sudo kill -9 5222

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2012-10-12
    相关资源
    最近更新 更多