在某些条件下删除缓存作业会导致 crontab 出现错误

在某些条件下删除缓存作业会导致 crontab 出现错误

我正在尝试应用一个 cronjob 来删除缓存,该缓存每分钟检查一次特定条件,如果条件满足,则执行该缓存,另外,如果执行时间超过一分钟,我不希望作业重叠,因此我使用 flock 来执行该缓存。该作业如下所示:

* * * * * flock -n /tmp/cachedrop.lock -c "if (( $(free -m | grep Mem | awk '{print ($3/$2) * 1000000}') > 34000 )) && (( $(free -m | grep Mem | awk '{print (($3+$6)/$2) * 1000000}') > 34000 )); then sync; echo 3 > /proc/sys/vm/drop_caches; fi"

cron 工作正常,没有任何语法错误。当我从 cli 运行命令时,它工作正常。但是作为 cron 作业,我在 /var/mail 上收到这封电子邮件:

/bin/sh: 1: 194155: not found

“194155”是第一个函数的输出。它会根据内存使用百分比而变化。我在 Ubuntu 和 Debian 机器上遇到了这个问题。我也尝试过分离这些函数来查看会发生什么,但问题仍然存在。

为了测试一下,我还尝试了这样的 cronjob:

* * * * * flock -n /tmp/ping.lock -c "timeout 300 ping 8.8.8.8"

运行良好,无错误,无重叠。锁定文件按预期工作。

想知道我是否在命令中犯了错误,在 centos 机器上也尝试了相同的 cronjob,它在那里运行得很好。请帮助我理解这个问题,我真的需要让它工作。

答案1

问题可能是flock使用从 cron 继承的值$SHELL来执行flock -c 'command'

$ echo $SHELL
/usr/bin/zsh

$ flock -n /tmp/mylock -c 'echo $0'
/usr/bin/zsh

$ SHELL=/bin/sh flock -n /tmp/mylock -c 'echo $0'
/bin/sh

在 Ubuntu 中, cron/bin/sh默认使用,它(与/bin/bash)不支持数字表达式,例如:

$ bash -c 'if ((2 > 1)); then echo Yes; fi'
Yes

然而

$ sh -c 'if ((2 > 1)); then echo Yes; fi'
sh: 1: 2: not found

您可以SHELL=/bin/bash在 crontab 文件中分配,但是由于您的命令有些复杂,我建议为其创建一个独立的 bash 脚本(使用适当的#!/bin/bashshebang)并调用作为flock -c命令。

相关内容