N = 50000
with open('input', 'w') as f:
for i in range(N):
f.write(str(i) + '\n')
run_command = '/bin/bash -e -o pipefail -c "((sort | tee >/dev/null >(cat | (tee >/dev/null >(sort >&3)))) <input 3>output)& wait"'
subprocess.check_call(run_command, shell=True)
time.sleep(sleep_time)
print sh.wc("output", "-l")
使用 sleep_time = 0 运行这段 python 代码返回 0,但是使用 sleep_time = 1 返回 50000。
原因似乎是没有等待 bash 子进程完成。可能是我对 wait 函数的使用不正确。我做了实验,但没有找到令人满意的解决方案。
请您参考如下方法:
当您使用 /bin/bash 时,您的命令将在子 shell 中运行,因此您将立即退出该进程。您在该子 shell 中运行的命令也在后台运行,因为末尾有 &,您可以将 $! 作为参数传递给 wait 让它等待直到最后一个后台进程退出。
