cron调用bash脚本,该脚本调用;脚本“;运行python程序。在脚本/python完成之前,下一行bash脚本将立即运行

cron调用bash脚本,该脚本调用;脚本“;运行python程序。在脚本/python完成之前,下一行bash脚本将立即运行,python,linux,bash,cron,Python,Linux,Bash,Cron,当我通过cron运行下面的bash脚本时,最后一行在前一行完成之前运行。为什么?我如何执行我想要的命令? 我确信,cron在某种程度上是罪魁祸首,但为了论证起见,这里有一个虚拟的bash脚本(显然,这只是一个说明。在现实世界中,我正在python程序中做一些工作,然后试图在完成后将其工作产品复制到另一个地方。): …为了完整起见,这里是python脚本,sleeper.py: #!/usr/bin/env python3 import time print("python prog

当我通过cron运行下面的bash脚本时,最后一行在前一行完成之前运行。为什么?我如何执行我想要的命令?

我确信,
cron
在某种程度上是罪魁祸首,但为了论证起见,这里有一个虚拟的bash脚本(显然,这只是一个说明。在现实世界中,我正在python程序中做一些工作,然后试图在完成后将其工作产品复制到另一个地方。):

…为了完整起见,这里是python脚本,sleeper.py:

#!/usr/bin/env python3

import time

print("python program starting")
time.sleep(5)
print("python program done")
当我从命令行运行bash脚本时,一切正常。具体来说,“这是下一行…”文本在5秒睡眠后的最后打印

但是当我从cron运行它时,输出的顺序是错误的(这是cron运行作业后发给我的电子邮件):

因此,您可以看到“这是下一行…”在python脚本真正开始之前打印出来。就像它在后台运行python脚本一样

我被难住了。为什么会发生这种情况?如何使
echo
命令等待
script
完成python程序的运行


(最后,是的,我可以在发送给
脚本的命令中包含我的额外命令,我正在考虑这个问题。但是,拜托!这太疯狂了!)

我应该跟进并分享我提出的解决方案。最后,我从来没有得到一个很好的答案来解释为什么它会在我的(RedHat)环境中以这种方式运行,所以我决定采用一种变通方法。我

  • 在调用“脚本”之前创建了一个sentinel文件
  • 包括一个额外的命令,用于删除脚本命令文本中的sentinel文件,然后
  • 等待哨兵文件消失,然后继续
像这样:

sentinel=`mktemp`
script output -c "./sleeper.py; rm $sentinel"
while [ -f $sentinel ]
do
    sleep 3
done

是的,这是一个黑客攻击,但我需要继续前进。

我不会(在Ubuntu上)复制这个。检查了来自cron作业的邮件,对我来说,行的顺序与以交互方式运行它的顺序相同。您通过电子邮件发送的结果有一些非常奇怪的地方,尤其是
脚本开始,文件输出
行被重复(一次在开始,一次在结束)。在您的示例中,
“/sleeper.py;echo”…我们完成了”
?您是否使用
线程
运行其他程序?您是否使用
join()
等待线程结束?同意@alaniwi,奇怪的是,“脚本已启动…”行在电子邮件输出中重复。这是在一个红帽子盒子上。我没有想到它可能依赖于操作系统。我可以试着调查一下。谢谢。对不起,@furas,我已经更改了上面的文本,以解释我引用的“python脚本”是“sleep.py”。我希望这能澄清问题。我没有使用上面的
join()
,但我在第一次遇到这个问题时尝试过,但没有任何帮助。没有穿线;上面的示例是完整的,其行为方式与我描述的(在我的RedHat box上)相同。
Script started, file is output
Script done, file is output
This is the next line after invoking script...
python program starting
python program done
...and we are done
Script started, file is output
sentinel=`mktemp`
script output -c "./sleeper.py; rm $sentinel"
while [ -f $sentinel ]
do
    sleep 3
done