cron 调用 bash 脚本,该脚本调用“脚本”来运行 python 程序。

当我通过 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 脚本时,一切都很好。具体来说,“This is the next line...”文本在 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命令等到scriptpython 程序运行完毕?


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


茅侃侃
浏览 116回答 1
1回答

小怪兽爱吃肉

我应该跟进并分享我想出的解决方案。最后,我从来没有很好地回答为什么它在我的(RedHat)环境中以这种方式表现,所以我决定采用一种解决方法。我...在调用“脚本”之前创建了一个哨兵文件,在脚本的命令文本中包含一个额外的命令,用于删除哨兵文件,然后在继续之前等待哨兵文件消失。像这样:sentinel=`mktemp`script output -c "./sleeper.py; rm $sentinel"while [ -f $sentinel ]do    sleep 3done是的,这是一个 hack,但我需要继续前进。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python