python:subprocess调用一个运行后台进程挂起的脚本

时间:2014-01-15 15:23:22

标签: python subprocess background-process

我在调用脚本时使用subprocess.call时出现问题,脚本又会运行后台进程。

我从python脚本调用bash脚本。 python 2.7.3。

#!/bin/python
from subprocess import call
.
.
call(["run_exp",file_name])
print "exp complete!"
.
.

run_exp是一个bash脚本,它在后台运行一个进程。

#!/bin/bash
.
.
run_task auto_output 2>/dev/null &
.
.
echo "run_exp finished!"

run task命令是另一个bash脚本。这总是在run_exp完成时完成。

从命令行运行run_exp我看到了预期的行为,所有进程都完成了。

使用python run_exp调用call命令时出现问题。使用call时,我看到输出“run_exp finished!”但从来没有“完成!”。如果我从run_task中删除run_exp操作(及其run_exp中的操作的关联代码),call命令将按预期运行完成。这使我相信当调用的脚本在后台运行进程时使用call会出现问题。

任何人都可以解释为什么会发生这种情况。 谢谢!

1 个答案:

答案 0 :(得分:1)

后台脚本的输出仍然与子脚本的文件描述符相同。这就是父脚本仍在等待它完成的原因。

如果你想将它们妖魔化,你应该关闭后台脚本中的所有文件描述符:

(run_task auto_output >/dev/null 2>&1) &

(括号在子shell中执行此操作,我有时会发现它是必需的。)

此外,在您的子脚本末尾显式wait可以帮助后台进程:

run_task auto_output 2>/dev/null & backgroundPid=$!
...
echo "run_exp finished!"
wait "$backgroundPid"

如果两种策略都单独失败,也可以尝试将这两种策略结合起来。