cron 和 flock 与更改目录命令

cron 和 flock 与更改目录命令

我指定了以下 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

man 1 flock

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/zshcommand并且-c是的一部分arguments。等效的第二种形式是

flock -xn /tmp/ms.lockfile -c 'cd … && …'

但它可能使用不同的 shell。在我的 Debian 9 中,环境变量的值SHELL是相关的。了解了这一点,我们可以构建等效的(不仅仅是等效的)第二种形式:

SHELL=/bin/zsh flock -xn /tmp/ms.lockfile -c 'cd … && …'

相关内容