【问题标题】:cron invokes bash script which invokes "script" to run python program. Next line of bash script runs immediately, before script/python completescron 调用 bash 脚本,该脚本调用“脚本”来运行 python 程序。在 script/python 完成之前,下一行 bash 脚本立即运行
【发布时间】:2020-12-11 23:04:13
【问题描述】:

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

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

#!/usr/bin/env bash

cd /tmp/kier/script
script output -c "./sleeper.py; echo '...and we are done'"
echo "This is the next line after invoking script..."

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

#!/usr/bin/env python3

import time

print("python program starting")
time.sleep(5)
print("python program done")

当我从命令行运行 bash 脚本时,一切都很好。具体来说,“这是下一行...”文本在 5 秒睡眠后的最后打印。

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

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

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

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

(最后,是的,我可以在发送到script 的命令中包含我的额外命令,我实际上正在考虑这一点。但是来吧!这太疯狂了!)

【问题讨论】:

  • 我没有复制这个(在 Ubuntu 上)。检查了来自 cron 作业的邮件,对我来说,这些行的顺序与交互式运行它的顺序相同。您通过电子邮件发送的结果有些奇怪,尤其是 Script started, file is output 行重复(开始一次,结束一次)。
  • 在您的示例中"./sleeper.py; echo '...and we are done'" 是什么?你用threading 运行别的东西吗?你用join() 等待线程结束了吗?
  • 同意,@alaniwi,奇怪的是“脚本已启动...”行在电子邮件输出中重复出现。这是在 RedHat 盒子上。我没有想到它可能依赖于操作系统。我可以试着调查一下。谢谢。
  • 对不起,@furas,我已经更改了上面的文字来解释我引用的“python 脚本”是“sleeper.py”。我希望这能澄清事情。我没有使用上面的join(),但是当我第一次遇到这个问题时我确实尝试过它并没有帮助。而且没有线程;上面的示例是完整的,并且按照我描述的方式运行(在我的 RedHat 盒子上)。

标签: python linux bash cron


【解决方案1】:

我应该跟进并分享我想出的解决方案。最后,我从来没有得到一个很好的答案,为什么它在我的(RedHat)环境中表现得这样,所以我决定了一个解决方法。我……

  • 在调用“脚本”之前创建了一个哨兵文件,
  • 在脚本的命令文本中包含一个删除哨兵文件的额外命令,然后
  • 等待哨兵文件消失后再继续。

像这样:

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

是的,这是一个 hack,但我需要继续前进。

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2011-08-15
    • 2012-10-22
    • 2018-03-14
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多