在 cronjob 中使用 linux date 命令

Use linux date command in cronjob

我在 cronjob 中使用 linux 'date' 命令时遇到问题。

Linux版本:CentOSLinux7(核心)

我需要的是 9 天前的日期作为我的 test.sh 脚本的参数。 今天是10-08-2016,需要执行的作业是:

/scripts/test.sh 2016-08-01

我在 crontab 中的代码:

DATEVAR=$(date +%F --date="9 days ago")
0 12 * * tue ~/scripts/test.sh $($DATEVAR)

所以 linux 命令是 'date +%F --date="9 days ago"' 但我需要执行此命令并将其设置为参数。 它现在所做的是 运行 带有参数 '$(date':

的脚本
~/scripts/test.sh $(date

我尝试使用以下设置 DATEVAR 但没有成功:

DATEVAR='date +%F --date="9 days ago"'   
DATEVAR=date +%F --date="9 days ago"
DATEVAR=$(date +%F --date="9 days ago")
DATEVAR=(shell date +%F --date="9 days ago")

有谁知道这是否可行以及如何根据执行 'date' 命令的结果设置我的 DATEVAR?

我不确定你是否可以在 cron 作业中完成它。

一个简单的解决方法是将对 test.sh 的调用包装到另一个不带参数的脚本中。在里面,简单地写:

DATEVAR=$(date +%F --date="9 days ago")
~/scripts/test.sh $($DATEVAR)

在你的 cronjob 中调用这个。

这应该有效:

0 12 * * tue  _DV=`date +\%F --date="9 days ago"`; ~/scripts/test.sh $_DV

不幸的是,这里有几个问题需要克服。首先,cron 现在支持 "environment settings" 这一事实可能会产生误导。具有 shell 脚本经验的人可能很容易认为 shell 的全部功能可以在这里使用——事实并非如此。这些设置和它们来的一样愚蠢:它们是严格的逐字替换。在我看来,更好的绰号是 "placeholder assignment."

其次,您希望使用的日期字符串有些复杂。具体来说,它包含一个嵌入的引号字符串(“9 天前”)和一个特殊的 crontab 字符(惊喜!):表达式“+%F”中的“%”。 Cron 用换行符替换“%”——这是一个不错的功能,但如果您没有意识到或忘记它,就会感到惊讶。引号在分配阶段无法存活。

知道这一点,上面使用 "placeholder assignment" 的条目的替代方法是:

DT1 = date +%F
DT2 = 9 days ago

0 12 * * tue  _DV=`$DT1 --date="$DT2"`; ~/scripts/test.sh $_DV

这里我们正在捕获我们想要直接替换的片段,而不进行任何插值。

有 -- 两种解决方案的价格!