是否可以检查 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
如果您想另外确保它是常规文件而不是目录、命名管道或某种其他类型的文件,则可以使用-f
test 代替 test。-e
/tmp/signal.txt
为了保持 cron 计划的干净,可能值得将测试移到脚本本身中,这将允许您拥有如下的计划:
* * * * * /opt/myscript.sh
...而脚本的开头将包括测试并在测试失败时退出:
if [ ! -e /tmp/signal.txt ]; then
exit
fi
答案2
如果您想完全适应systemd
,cron
可以ConditionPathExists=/path/to/file
在[Unit]
服务部分使用。
检查路径是否是文件可能会更复杂一些,因为ConditionIsFile
不存在类似的直接测试。
选项1人们知道该文件永远不会为空,因此可以使用ConditionFileNotEmpty=/path/to/file
选项2如果文件的大小也可能为零,并且需要检查是否存在并且它是一个文件,则可以测试路径是否存在并且它不是作为一个目录:
ConditionPathExists=/path/to/file
ConditionPathIsDirectory=!/path/top/file
=!
逻辑在哪里不是操作员。