You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:43:19