如果以 `subprocess.Popen` 开始,`ps -ef` 显示 运行 进程两次
`ps -ef` shows running process twice if started with `subprocess.Popen`
我在一个更大的 Python 程序中使用以下代码片段在后台生成一个进程:
import subprocess
command = "/media/sf_SharedDir/FOOBAR"
subprocess.Popen(command, shell=True)
之后我想检查当我的 Python 程序返回时进程是否为 运行ning。
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 那么这两个进程是 运行ning 吗?我的 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
对 运行 bash 命令为真,我将如何解决这个问题?
没有任何问题,你看到的是完全正常的。没有"fix".
您的每个进程都有不同的功能。顶级进程是 运行 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 程序中使用以下代码片段在后台生成一个进程:
import subprocess
command = "/media/sf_SharedDir/FOOBAR"
subprocess.Popen(command, shell=True)
之后我想检查当我的 Python 程序返回时进程是否为 运行ning。
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 那么这两个进程是 运行ning 吗?我的 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
对 运行 bash 命令为真,我将如何解决这个问题?
没有任何问题,你看到的是完全正常的。没有"fix".
您的每个进程都有不同的功能。顶级进程是 运行 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)