【发布时间】:2016-06-24 06:33:22
【问题描述】:
我有一个 cron 作业,它调用一个每小时检查一次更新的脚本。如果有更新,它将调用update.sh,而后者又调用commands.sh。我希望每个“新”commands.sh 只运行一次。
每次我使用该文件的某个唯一 ID 运行 commands.sh 时,我都在考虑写入文件。在运行commands.sh 之前,我检查文件是否包含commands.sh 的ID。如果是这样,请不要运行它。
编辑 - 更多细节:
定时任务:
- 从 git repo 获取,如果有任何变化,拉取并合并
-
运行
update.sh:#!/bin/sh ./commands.sh
我希望./commands.sh 只运行一次,因为下一小时,cron 将再次运行,从 git 中拉出,然后再次运行 update.sh。有没有办法让每个唯一的./commands.sh 只运行一次?
写完之后,也许最好的方法是只运行update.sh,如果 git repo 有变化?
这似乎有点矫枉过正且难以维护。有没有更简单的方法来编写只运行一次的 bash 脚本?
【问题讨论】:
-
您的问题是
commands.sh的前一个实例在下次更新到期时可能仍在运行吗?或者还有谁在调用第二个实例? -
您是否尝试将
cron用作进程监督系统(负责保持守护程序运行,如果它退出则重新启动它,但从不启动多个实例)?因为最佳实践答案是“不要”——有真正为此目的而构建的流程监督服务,它们会做得更好。 -
...同样,如果您的目标是每次将内容推送到
git... 时都运行一个命令...好吧,有git特定的方法可以做到这一点没有依赖cron的所有滞后和通用失败。 -
对于小型嵌入式系统,
runit是您的最佳选择;它的作者做了一些努力来确保它可以与微小的libcs(比 glibc 小得多)一起工作。见jtimberman.housepub.org/blog/2012/12/29/…(第一个谷歌链接,但在浏览时,我喜欢它所说的)。 -
你为什么不在完成后立即从系统中删除(删除)./commands.sh 文件。它再也不会运行了:)