我需要每小时执行一次 shell 脚本。但是,在上一次运行完成之前,我不想开始下一次运行。
答案1
由于您将问题标记为 Linux,因此您可以使用flock
锁定一个众所周知的文件:
flock "${TMPDIR:-/tmp}"/some_name.lock /path/to/your_command -options
该命令的第二个实例(以相同的方式运行)将等待第一个实例完成。这种方法的问题是,如果该命令经常需要一个多小时,您就会积累越来越多的实例等待锁定。
或者,如果第一个实例尚未完成,您可以跳过运行第二个实例:
flock -n "${TMPDIR:-/tmp}"/some_name.lock /path/to/your_command -options
这种方法的问题是您每天运行该命令的次数可能少于 24 次。
答案2
您需要更好地定义您的问题。
Sato 描述了一种新实例如何备份到延迟实例之后的方法。
Jaroslav 的解决方案仅提供了一种机制来检测前一个实例尚未完全完成。
另一种选择是在脚本本身内安排脚本的下一个实例:
at now + 1 hour $*
您需要定义前一个实例尚未完成时的行为,以及您是否希望实例每小时启动一次,还是在完成和启动之间的定义间隔内启动。
答案3
您可以在脚本启动时创建一些临时文件,并在脚本关闭之前将其删除。该脚本应检查该文件是否存在。如果它找到它,它就会关闭并且不执行任何操作。如果没有,请创建它并继续。
或者在 cron 作业中,您可以使用 pgrep 检查正在执行的脚本,只有在没有执行时才继续。