我想找到一种方法来查找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
在命令shell中,我可以运行sudo kill -9 [process id]
并成功终止该作业。
问题是,我们的大多数工作都有多个构建步骤,并且我们在此服务器上运行了多个项目。我们的许多构建步骤都是shell脚本,Windows批处理文件,其中一些是ant脚本。我想知道如何找到Jenkins作业的进程ID,它是所有构建步骤的父进程。截至目前,我必须等到所有其他构建完成并重新启动服务器。谢谢你的帮助!
答案 0 :(得分:3)
在* nix操作系统上,您可以通过调查import 'just/referencingthis/forpackaging';
来查看正在运行的流程的环境变量,并查找Jenkins特定变量,例如/proc/$pid/environ
,BUILD_ID
等。
BUILD_URL
您可以了解cat /proc/'$pid'/environ | grep BUILD_URL
或了解正在运行的流程。
答案 1 :(得分:1)
这是我的问题的更新。为了杀死挂起(僵尸)的工作,我相信这只适用于Jenkins从与其工作相同的服务器运行的情况。我怀疑如果你试图杀死在Jenkins奴隶上运行的挂起进程,这将会有效。
#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