如何等待后台子进程完成后再进行更多操作?

问题描述 投票:0回答:1

我有一个执行计算的程序,从 Linux 终端上的命令行运行。 它使用类似的命令

program_name -i input_file -o output_file1 -r output_file2 -w dependency1 -d dependency2

我有一个 Python 包装脚本,我用它来进行一些文件处理并执行上述命令。 该脚本也从 Linux 终端运行执行。 由于计算程序可能需要很长时间才能运行(从几分钟到几小时),我希望能够将终端输出(每 10 秒写入输出的 CPU 和程序时间)写入文件并将进程发送到后台,以便我可以继续其他终端操作。 我实际上尝试作为子进程执行的命令是

nohup

问题是
program_name -i input_file -o output_file1 -r output_file2 -w dependency1 -d dependency2 </dev/null >output.log 2>&1 &

及其依赖项存储在共享网络位置中,由于参数长度的限制,我无法使用程序/文件的路径运行程序。 我需要创建到程序/文件的符号链接,运行该程序,然后取消链接程序和文件。 如果我在终端前台运行子进程,则效果很好。 然而,当我尝试在后台运行子进程时,Python 不会等待它完成,然后再继续执行下一段代码,这会取消程序和依赖项的链接,从而导致程序失败。

我的代码是这样工作的

program_name

如果子进程通过删除末尾
# create symbolic links for file in [program_name, dependency1, dependency2, dependency3]: src = path_to_program / file dst = current_directory / file try: os.symlink(src, dst) except FileExistsError: pass # create command cmd = "program_name -i {inp} -o {out1} -r {out2} -w {dep1} -d {dep2} </dev/null >output.log 2>&1 &".format( inp=input_file out1=output_file1 out2=output_file2 dep1=dependency1 dep2=dependency2 ) proc = subprocess.run(cmd, stderr=None, stdout=None, shell=True) # remove symbolic links for file in [program_name, dependency1, dependency2, dependency3]: os.unlink(current_directory / file)

在前台运行,则脚本将等待子进程完成,然后再取消链接文件。 如果在后台运行,一旦子进程启动,脚本就会继续取消链接文件并中断子进程。

我错过了什么?  据我了解 

&

应该等待子进程完成后再继续,但它似乎没有这样做。 我还尝试将

subprocess.run()
subprocess.Popen()
.wait()
.communicate()
subprocess.call()
subprocess.check_call()
一起使用,并获得了与所有这些相同的行为。
如果我尝试使用

os.system()

喜欢

shell=False

然后 
proc = subprocess.run(shlex.split(cmd), stderr=None, stdout=None, shell=False)

尝试读取

program_name
作为参数并返回错误。
    

python linux ksh
1个回答
0
投票
shell

会立即退出,Python 不知道 </dev/null >output.log 2>&1 & 何时实际完成。

不要使用外壳。直接执行 

program_name

,并使用

program_name
的功能来进行 I/O 重定向,而不是 shell 构造。
subprocess

	
© www.soinside.com 2019 - 2024. All rights reserved.