如果以`subprocess.Popen`

时间:2015-12-01 15:25:04

标签: 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导致此问题(如果是1)。但是,如果我要求shell为True来运行bash命令,我该如何解决?

1 个答案:

答案 0 :(得分:0)

没有错,你看到的是完全正常的。没有"修复"。

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

第二个过程/bin/sh -c /media/sf_SharedDir/FOOBAR'是解释cmd行的shell(因为您希望|*$HOME被解释,您指定{{1} }})。

第三个进程shell=True是FOOBAR cmd。 /bin/sh /media/sf_SharedDir/FOOBAR来自您的FOOBAR计划中的/bin/sh行。如果是C程序,您只需在此处查看#!即可。如果它是一个python程序,你会看到/media/sf_SharedDir/FOOBAR

如果你真的被第二个进程困扰,你可以像这样修改你的python程序:

/usr/bin/python/media/sf_SharedDir/FOOBAR