python subprocess - 分离进程

2024-01-09

我有一个 python 脚本af_audit_run.py,它调用另一个Python脚本request_audit.py通过subprocess.

第二个脚本request_audit.py在后台调用另一个子进程并返回请求 ID。

问题出在第一个脚本上af_audit_run.py,它应该在第二个脚本返回请求 id 后立即退出,正在等待整个后台进程完成。有没有什么方法可以强制第一个脚本在请求 id 返回后立即退出?

af_audit_run.py-- 使用等待结果communicate method:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE)
result, error = p.communicate()
print(result.decode('utf-8'))
print(error.decode('utf-8'))

request_audit.py-- 不等待,只需分离子进程(第三个 python 脚本)并返回请求 id:

subprocess.Popen(cmd, shell=True, stdout=None, stderr=None, close_fds=True)
print(request_id)

环境:Linux


您需要确保第三个进程的标准输出和标准错误定向到除发出该进程的管道之外的其他位置。af_audit_run.py正在读取输出。

现有代码的问题在于使用stdout=None, stderr=None,您正在请求default操作(就好像您根本没有使用过这些关键字一样)。这是写入与父进程相同的输出流,在本例中request_audit.py,使用子进程分叉时继承的文件描述符。这意味着顶层af_audit_run.py将等待输出,因为在第三个进程完成之前它不会在该输出流上看到文件结尾。

这可以在输出中看到lsof- 在下面的例子中,第三个进程是命令/bin/sleep 600(参见最后的测试代码)。

这是其中的一部分lsof第三个过程的输出:

sleep   3057  myuser    0u   CHR 136,20      0t0      23 /dev/pts/20
sleep   3057  myuser    1w  FIFO   0,13      0t0 9441062 pipe
sleep   3057  myuser    2w  FIFO   0,13      0t0 9441063 pipe

这是其中的一部分lsof顶层的输出af_audit_run.py:

python3 3053  myuser    0u   CHR 136,20      0t0      23 /dev/pts/20
python3 3053  myuser    1u   CHR 136,20      0t0      23 /dev/pts/20
python3 3053  myuser    2u   CHR 136,20      0t0      23 /dev/pts/20
python3 3053  myuser    3r  FIFO   0,13      0t0 9441062 pipe
python3 3053  myuser    5r  FIFO   0,13      0t0 9441063 pipe

如您所见,sleep本例中的进程 (pid 3057) 的 stdout (fd 1) 和 stderr (fd 2) 流连接到顶级进程 (pid 3053) 正在读取的管道的写入端 - 请注意倒数第二列——即使它不是该进程的直接父进程。

您正在指定close_fds=True,但这就是有记录的 https://docs.python.org/3/library/subprocess.html如下:

"If 关闭_fds为 true,所有文件描述符除了 0、1 和 2将在子进程执行之前关闭。”(强调我的)

因此,它对 stdin、stdout 或 stderr 流没有任何影响,尽管有任何影响other打开的文件描述符将在子进程中关闭。

如果代替stdout=None, stderr=None你用stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,那么这将显式地将这些流定向到空设备(/dev/null在 Linux 上),然后af_audit_run.py不必等待。

一些输出来自lsof在这种情况下:

sleep   3318  myuser    0u   CHR 136,20      0t0      23 /dev/pts/20
sleep   3318  myuser    1u   CHR    1,3      0t0       6 /dev/null
sleep   3318  myuser    2u   CHR    1,3      0t0       6 /dev/null

也可以使用stdin=subprocess.DEVNULL这样,如果进程尝试读取,它将看到文件结尾。在这个例子中我没有这样做,它的输入仍然连接到终端设备,尽管这并不影响是否af_audit_run.py等待它。


测试代码

af_audit_run.py

import subprocess

cmd = "python3 request_audit.py"

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, 
                     stderr=subprocess.PIPE)
result, error = p.communicate()
print(result.decode('utf-8'))
print(error.decode('utf-8'))

request_audit.py

import subprocess

cmd = "/bin/sleep 600"

subprocess.Popen(cmd, shell=True,
                 stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

print(5)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python subprocess - 分离进程 的相关文章

随机推荐

  • constexpr 计算负位移位时未定义的行为?

    考虑以下代码片段 int main constexpr int x 1 if x gt 0 constexpr int y 1 lt
  • 如何在 AWS Route 53 中将流量从非 www 域名重定向到 www.example.com

    我在 AWS Route 53 中拥有一个域名 www derbyware com 我有一个 Web 应用程序运行在 http node147934 env 7029269 phx enscaled us http node147934 e
  • 如何运行独立的 Eclipse MAT?

    我使用 jmap 生成了 hprof sudo jdk bin jmap F dump file app hprof 5003 现在 我在 eclipse 中解析 hprof 时遇到 OOM Java Heap Space 错误 我想我需要
  • GLEW 链接问题找不到 __imp_glGetIntegerv

    注意 是的 我已经指定了 GLEW STATIC 因此 在尝试设置glew以在新项目中使用之前 我已经经历过这个牛仔竞技表演 但现在我在项目中使用glew 2 0 它产生了链接错误 我刚刚在 Linux 实例中生成了源代码并像这样使用它们
  • Celery + Redis - .get() 平稳运行约 70 小时后无限期挂起

    几天内一切都运行良好 但后来我无限期地挂在 get 上 发生无限期挂起所需的时间各不相同 但都在运行 24 到 72 小时之间 我怀疑这与Redis代理有关 的输出CLIENT LIST in redis cli显示大量连接且空闲数非常高
  • fullcalendar js 中未显示的事件

    请任何人帮我找出代码中出了什么问题 我使用 fullcalendar js 来处理日历事件 我想在日历中显示事件 下面是我的代码 document ready function window resize function calendar
  • 使用采样数据时CRC32函数如何工作?

    我想问你关于Python中以下短函数的解释 from zlib import crc32 def test set check identifier test ratio return crc32 np int64 identifier 0
  • Getline错误MFC vs2012(msvcp110.dll)

    我在使用 vs2012 中的 std getline 函数与 MFC 应用程序时遇到问题 同样的代码在vs2010中运行 这就是为什么我确信这不是代码本身的问题 void AddImage OnClickedIdbAiRegistratio
  • 具有自动完成功能的自定义交互式 Shell

    我的任务是创建一个嵌入到 python 中的交互式 shell 这样 当从命令行调用时 它将被放入该 shell 中 谁能给我推荐一个可以做到这一点的图书馆 我需要能够创建自定义单词 操作 以便当用户键入这些单词时 我的程序可以执行我创建的
  • 在 .js 文件中执行 PHP 代码

    我试图在 js 文件中执行一些 PHP 代码 但显然不知道如何正确执行 基本上 代码是向我的页面添加一些 HTML 标签 我将其用于滑出式联系表单 然而 联系表单本身是在 Wordpress 中通过短代码完成的 因此 我试图让短代码在使表单
  • 指定内容的构建操作 - Nuget

    告诉 Nuget 包将所有 css 文件添加为嵌入式资源 即构建操作是嵌入式资源 的最简单方法是什么 我试图通过工具文件夹中的 install ps1 来完成此操作 但仍然无法到达任何地方 注意 我正在从目录结构 tools content
  • switch case 编程练习

    enum SQLErrorCode OK 0 PARTIAL OK 1 SOMEWHAT OK 2 NOT OK 3 Code 1 int error getErrorCode if error SQLErrorCode PARTIAL O
  • 我可以通过 ssh 连接到 Windows,启动命令并让它在我注销时运行吗?

    现在 Windows 10 包含了 openSSH 服务器 是否有某种方法可以启动程序并让它在我注销时运行 在 Linux 上 有 screen 和 tmux 但是 Windows 上呢 Notes 能够重新附加到进程会很好 但这不是必需的
  • 当 list-marker 是伪元素时,list-style-position 不起作用。为什么?

    我想创建彩色列表标记 ul 我做到了 但现在在所有列表中list style position属性不起作用 这是代码 ul FirmStyle list style type none ul FirmStyle li before colo
  • asp.net正则表达式验证器客户端脚本错误

    我有以下正则表达式验证器来检测输入字符串是否包含 HTML 脚本标记 如果是则导致验证错误
  • Nodejs从哪里开始?

    我已经安装了nodejs并运行了几个简单的示例 例如在端口上打开服务器并侦听该端口 但是 我仍然无法将nodejs与web开发联系起来 所以为了学习和实现nodejs 我正在考虑使用rails和nodejs制作井字游戏 这可能吗 我正在设想
  • jQuery 可拖动自定义对齐网格

    我在项目中使用 jQuery UI Draggable 我有一个复选框可以切换可拖动对象上的网格 10x10 网格 选项 但是 当网格重新打开时 网格关闭时移动的对象不会与网格关闭时未移动的对象对齐 简而言之 这些对象位于不对齐的单独网格上
  • 自定义错误页面 .Net Core Web 应用程序未显示 500 错误

    我在生产中创建了一个自定义错误页面 它将要求用户更正 HTTP 状态代码页面 而不是显示丑陋的开发人员错误页面 我现在的代码如下 启动 cs public void Configure IApplicationBuilder app IHo
  • Bookshelf.js - 如何保存多对多关系?

    我在以 多对多 关系保存数据时遇到问题 这是我的模型 var CoursePeople bookshelf Model extend tableName course people var Course bookshelf Model ex
  • python subprocess - 分离进程

    我有一个 python 脚本af audit run py 它调用另一个Python脚本request audit py通过subprocess 第二个脚本request audit py在后台调用另一个子进程并返回请求 ID 问题出在第一