Jenkins Docker容器中调用psutil.Process()报NoSuchProcess错误
问题:Jenkins流水线中Docker容器内执行
psutil.Process()触发psutil.NoSuchProcess错误 在Jenkins运行器的Docker环境中执行psutil.Process()时,会持续触发psutil.NoSuchProcess: process PID not found错误。但该操作在Jenkins运行器外的Docker/Podman环境(覆盖Linux/Windows/MacOS多系统及不同版本容器工具)、不同版本psutil包下均能正常运行,且始终使用基于Debian的Docker镜像(如python:3.11.7-bookworm等)。
测试用Python脚本
import psutil p = psutil.Process()
测试用Jenkinsfile示例
pipeline { agent { label 'Linux' } stages { stage("Test") { steps { script { sh ''' podman run -dit --name test --rm docker_image podman exec -it test /bin/bash -c "python test.py" ''' } } } } }
完整错误追踪信息
Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1643, in wrapper return fun(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 486, in wrapper raise raise_from(err, None) ^^^^^^^^^^^^^^^^^^^^^ File "<string>", line 3, in raise_from File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 484, in wrapper return fun(self) ^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1705, in _parse_stat_file data = bcat("%s/%s/stat" % (self._procfs_path, self.pid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 820, in bcat return cat(fname, fallback=fallback, _open=open_binary) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 808, in cat with _open(fname) as f: ^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/_common.py", line 772, in open_binary return open(fname, "rb", buffering=FILE_READ_BUFFER_SIZE) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [Errno 2] No such file or directory: '/proc/2/stat' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/psutil/__init__.py", line 350, in _init self.create_time() File "/usr/local/lib/python3.11/site-packages/psutil/__init__.py", line 735, in create_time self._create_time = self._proc.create_time() ^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1643, in wrapper return fun(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1870, in create_time ctime = float(self._parse_stat_file()['create_time']) ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/_pslinux.py", line 1652, in wrapper raise NoSuchProcess(self.pid, self._name) psutil.NoSuchProcess: process no longer exists (pid=2) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "test.py", line 3, in <module> p = psutil.Process() ^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psutil/__init__.py", line 313, in __init__ self._init(pid) File "/usr/local/lib/python3.11/site-packages/psutil/__init__.py", line 362, in _init raise NoSuchProcess(pid, msg='process PID not found') psutil.NoSuchProcess: process PID not found (pid=2)
解决方案
1. 移除podman exec的交互参数
Jenkins执行环境为非交互式,-it参数会导致终端环境异常,进而干扰进程PID读取。将podman exec命令中的-it改为-i或直接移除:
podman exec -i test /bin/bash -c "python test.py"
或:
podman exec test /bin/bash -c "python test.py"
2. 直接在容器启动时执行脚本
避免使用exec进入容器执行,直接在podman run阶段指定脚本启动命令,让Python进程成为容器PID 1,规避PID读取异常:
podman run --rm docker_image python test.py
3. 显式指定当前进程PID
如果必须使用exec方式,修改Python脚本显式传入当前PID,避免psutil.Process()自动获取PID时的异常:
import psutil import os p = psutil.Process(os.getpid())
4. 检查容器权限(测试环境专用)
若上述方法无效,可在启动容器时添加--privileged参数,确保Jenkins运行器拥有足够权限访问容器的proc文件系统(生产环境需谨慎使用):
podman run -dit --name test --rm --privileged docker_image
内容的提问来源于stack exchange,提问作者robocat314
相关产品推荐
相关产品推荐

