为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2023-06-13 09:58:27
当我通过 cron 运行以下 bash 脚本时,最后一行在前一行完成之前运行。为什么?我怎样才能执行我想要的命令?我确信这cron是罪魁祸首,但为了争论,这里有一个虚拟的bash 脚本 (显然,这只是一个例子。在现实世界中,我正在 python 程序中做一些工作,然后尝试完成后将其工作产品复制到另一个地方。):#!/usr/bin/env bashcd /tmp/kier/scriptscript output -c "./sleeper.py; echo '...and we are done'"echo "This is the next line after invoking script..."...为了完整起见,这里是python 脚本,sleeper.py:#!/usr/bin/env python3import timeprint("python program starting")time.sleep(5)print("python program done")当我从命令行运行 bash 脚本时,一切都很好。具体来说,“This is the next line...”文本在 5 秒睡眠后的最后打印。但是当我从 cron 运行它时,输出顺序错误(这是 cron 运行作业后发给我的电子邮件):Script started, file is outputScript done, file is outputThis is the next line after invoking script...python program startingpython program done...and we are doneScript started, file is output所以你可以看到“这是下一行......”在 python 脚本真正启动之前打印出来。就好像它在后台运行 python 脚本一样。我很难过。为什么会发生这种情况,如何让echo命令等到scriptpython 程序运行完毕?(最后,是的,我可以在发送到的命令中包含我的额外命令script,我实际上正在考虑这一点。但是来吧!这太疯狂了!)
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我应该跟进并分享我想出的解决方案。最后,我从来没有很好地回答为什么它在我的(RedHat)环境中以这种方式表现,所以我决定采用一种解决方法。我...

  • 在调用“脚本”之前创建了一个哨兵文件,

  • 在脚本的命令文本中包含一个额外的命令,用于删除哨兵文件,然后

  • 在继续之前等待哨兵文件消失。

像这样:

sentinel=`mktemp`

script output -c "./sleeper.py; rm $sentinel"

while [ -f $sentinel ]

do

    sleep 3

done

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


查看完整回答
反对 回复 2023-06-13
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信