我指定了以下 cronjob,它按预期工作,但有时它会运行不应该发生的重复作业。也就是说,必须先终止第一个作业。
命令如下:
10 * * * * cd /home/info/ && /home/info/file -a 10 -b "randomstring" >> /home/log.txt 2>&1
如您所见,我包含了“cd”命令,因为脚本需要读取某些文件;请参见此处(https://superuser.com/a/155634)。现在,为了解决重复作业的问题,我决定添加 flock,不幸的是它似乎不接受上述命令。
命令如下:
10 * * * * /usr/bin/flock -xn /tmp/ms.lockfile 'cd /home/info/ && /home/info/file -a 10 -b "randomstring"' >> /home/log.txt 2>&1
错误:
flock:无法执行 cd /home/info/ && /home/info/file -a 10 -b “randomstring”:没有此文件或目录
有人能告诉我我是否执行了错误的命令吗
答案1
flock [options] file|directory command [arguments] flock [options] file|directory -c command
第一种形式command
应为单个可执行文件。它的参数应作为单独的参数提供flock
。
您使用的是第一种形式,并且您的 (单引号)cd /home/info/ && /home/info/file -a 10 -b "randomstring"
变为command
。没有这样的命令。
此外,您还使用了cd
和&&
。这意味着您不能直接删除单引号。您需要一个 shell 来解释&&
并使其cd
按预期工作。根据以下内容使用第二种形式:
-c
,使用 向 shell--command command
传递一个不带参数的单个。command
-c
-c
只需在 之前添加'cd … && …'
。该行将变为:
10 * * * * /usr/bin/flock -xn /tmp/ms.lockfile -c 'cd /home/info/ && /home/info/file -a 10 -b "randomstring"' >> /home/log.txt 2>&1
注意,你可以使用第一种形式来明确指定一个 shell(例如zsh
):
flock -xn /tmp/ms.lockfile /bin/zsh -c 'cd … && …'
这里-c
不是区分第二种形式的那个。该行使用第一种形式:/bin/zsh
是command
并且-c
是的一部分arguments
。等效的第二种形式是
flock -xn /tmp/ms.lockfile -c 'cd … && …'
但它可能使用不同的 shell。在我的 Debian 9 中,环境变量的值SHELL
是相关的。了解了这一点,我们可以构建等效的(不仅仅是等效的)第二种形式:
SHELL=/bin/zsh flock -xn /tmp/ms.lockfile -c 'cd … && …'