python - 如果以 `ps -ef` 启动,`subprocess.Popen` 显示运行进程两次

标签 python linux python-3.4 ps

我在一个更大的 Python 程序中使用以下代码片段在后台生成一个进程:

import subprocess

command = "/media/sf_SharedDir/FOOBAR"
subprocess.Popen(command, shell=True)

之后我想检查当我的 Python 程序返回时进程是否正在运行。 ps -ef | 的输出grep -v grep | grep FOOBAR:

ap    3396   937  0 16:08 pts/16   00:00:00 /bin/sh -c /media/sf_SharedDir/FOOBAR
ap    3397  3396  0 16:08 pts/16   00:00:00 /bin/sh /media/sf_SharedDir/FOOBAR

我很惊讶地看到两行并且它们有不同的 PID 那么这两个进程是否正在运行?我的 Popen 调用有问题吗?

FOOBAR 脚本:

#!/bin/bash

while : 
do
        echo "still alive"
        sleep 1
done

编辑:在终端 ps 中启动脚本只显示一个进程。

开始于 ./FOOBAR

ap@VBU:/media/sf_SharedDir$ ps -ef | grep -v grep | grep FOOBAR
ap    4115  3463  0 16:34 pts/5    00:00:00 /bin/bash ./FOOBAR

编辑 shell=True 导致了这个问题(如果是的话)。但是,如果我需要 shell 为 True 才能运行 bash 命令,我该如何解决这个问题?

最佳答案

没有任何问题,你看到的是完全正常的。没有“修复”。

您的每个流程都有不同的功能。顶层进程正在运行 python 解释器。

第二个进程,/bin/sh -c/media/sf_SharedDir/FOOBAR' 是解释 cmd 行的 shell(因为你想要 |*$HOME 进行解释,您指定了 shell=True)。

第三个进程,/bin/sh/media/sf_SharedDir/FOOBAR 是 FOOBAR cmd。 /bin/sh 来自 FOOBAR 程序中的 #! 行。如果它是 C 程序,您只会在此处看到 /media/sf_SharedDir/FOOBAR。如果它是一个 Python 程序,您会看到 /usr/bin/python/media/sf_SharedDir/FOOBAR

如果你真的对第二个过程感到困扰,你可以像这样修改你的python程序:

command = "exec /media/sf_SharedDir/FOOBAR"
subprocess.Popen(command, shell=True)

关于python - 如果以 `ps -ef` 启动,`subprocess.Popen` 显示运行进程两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34023898/

相关文章:

python - 我不知道如何在 Python 中创建一个调用我的函数的字典

python - 仅在 sys.argv[1] 存在时执行代码

python - 半金字塔数列倍数

python - 如何阻止我的蛇向自身移动(python,pygame)

python 使用 win32api 设置控制台全屏(或最大窗口大小)

python - Yampy导入错误: no module named 'authenticator'

linux - 命令 'cut' 不显示最后一列 CSV

linux - 丢弃传入的 UDP 数据包而不读取

linux - 如果路径中存在模式,则执行

python - 如何去除所有整数和空格的字符串