如何仅在文件存在时运行 crontab 作业?

如何仅在文件存在时运行 crontab 作业?

是否可以检查 crontab oneliner 中是否存在文件,并且仅在该文件存在时才执行脚本?

伪代码:

* * * * * <if /tmp/signal.txt exists> run /opt/myscript.sh

答案1

从技术上讲,您无法避免根据文件是否存在来运行 cron 作业,但您可以让该作业测试该文件是否存在,然后根据该测试的结果采取进一步的操作。

使用普通测试是否存在,如果测试成功则运行脚本。

* * * * *       if [ -e /tmp/signal.txt ]; then /opt/myscript.sh; fi

或者

* * * * *       if test -e /tmp/signal.txt; then /opt/myscript.sh; fi

或者,使用短路语法。这样做会导致工作失败如果该文件不存在(这可能会触发来自 cron 守护程序的电子邮件):

* * * * *       [ -e /tmp/signal.txt ] && /opt/myscript.sh

或者

* * * * *       test -e /tmp/signal.txt && /opt/myscript.sh

如果您想另外确保它是常规文件而不是目录、命名管道或某种其他类型的文件,则可以使用-ftest 代替 test。-e/tmp/signal.txt

为了保持 cron 计划的干净,可能值得将测试移到脚本本身中,这将允许您拥有如下的计划:

* * * * *       /opt/myscript.sh

...而脚本的开头将包括测试并在测试失败时退出:

if [ ! -e /tmp/signal.txt ]; then
    exit
fi

答案2

如果您想完全适应systemdcron可以ConditionPathExists=/path/to/file[Unit]服务部分使用。


检查路径是否是文件可能会更复杂一些,因为ConditionIsFile不存在类似的直接测试。

选项1人们知道该文件永远不会为空,因此可以使用ConditionFileNotEmpty=/path/to/file

选项2如果文件的大小也可能为零,并且需要检查是否存在并且它是一个文件,则可以测试路径是否存在并且它不是作为一个目录:

ConditionPathExists=/path/to/file
ConditionPathIsDirectory=!/path/top/file

=!逻辑在哪里不是操作员。

相关内容