我想自动运行 Python 脚本。我想我已经知道如何使用 cron 条目来实现这一点。
问题是,仅当前一个脚本完成后,我才需要再次运行这个脚本。
Python 脚本从.csv
文件中读取(仅第一条记录),并将其作为脚本的参数。然后,该记录从该表(本质上就像需要完成的运行列表)中删除,并与脚本结果一起移至另一个已完成任务的表中。
因此,由于每次运行时都会删除记录,所以我需要仅在前一个脚本完成后才启动下一个脚本的迭代。
我如何/可以在 Ubuntu 16.04 LTS 下做到这一点?
编辑:
我尝试以这种方式安排 python 脚本并像这样安装 run-one:
sudo apt-get update
sudo apt-get install run-one
# The below code is in crontab
* * * * * run-one python '/home/phdmonster/Downloads/nn course/my_code.py'
而且,它不起作用。没有运行任何任务。
由 Sergiy Kolodyazhnyy 编辑:问题已在评论中解决,也在链接的聊天室中讨论过;问题出在额外的*
、链接的重复作品上,正如 OP 的评论
答案1
由于您使用的是 cron,因此我假设您会定期启动脚本。每次运行都会修改结果文件。
因此脚本可以在启动时执行以下操作:
- 检查结果文件是否存在(即这是第一次运行)
- 如果没有,则创建它
- 计算前一次运行的开始时间
- 检查结果文件的修改时间是否比此开始时间新
- 如果不是,则意味着最后一次运行尚未完成,因此脚本将退出而不执行任何操作
前两项用于启动进程。如果不包括它们,第一次运行将不会执行任何操作,因为它正在等待不存在的前任完成。
答案2
如果您从 cron 启动脚本,并希望在启动下一个脚本之前检查前一个脚本是否已终止,您可以让脚本在某些预定义的位置创建指向其在 /proc(/proc/[PID])中的表示的符号链接,然后在最后将其删除。
然后,您必须在再次运行链接之前检查它是否已断开,或者检查它的命令行/proc/[PID]/cmdline
如果它没有断开,因为崩溃会阻止链接被删除,并且会出现另一个具有相同 PID 的进程(如果进程仍在运行,命令行将具有预期的内容。如果是其他内容,则意味着它只是具有相同 PID 的另一个进程)。
如果您只是想链接一系列脚本但前提是前一个脚本没有错误,那么您可能不需要 cron。
您可能只使用&&
语法来链接不同的脚本:shell 将测试一个脚本的返回代码,并且只有在没有错误的情况下才启动下一个脚本:
script1 && script2
如果您希望重复执行一个脚本,而没有错误,您可以使用该while
语法重复执行它,直到它返回非零返回代码。
while script; do true; done # here the true command, is just a "no operation"