【问题标题】:Use linux date command in cronjob在 cronjob 中使用 linux date 命令
【发布时间】:2016-12-16 22:33:27
【问题描述】:

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

Linux 版本:CentOS Linux 7 (Core)

我需要的是 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?

【问题讨论】:

  • 这里没有足够的信息来提供权威的答案。你用的是什么风格的 Linux?有些(Ubuntu?)不使用 bash 作为他们的 /bin/sh,有些 shell 可能不支持 $(..) 表示法。请尝试使用反引号。还可以尝试转义百分比字符。此外,$($DATEVAR) 可能是错误的(在您的 crontab 中),因为您将执行 date 命令的输出,就好像它本身就是一条评论一样。

标签: linux date crontab


【解决方案1】:

这应该可行:

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

不幸的是,这里有几个问题需要克服。首先,cron 现在支持“环境设置”这一事实可能会产生很大的误导。具有 shell 脚本经验的人可能很容易认为 shell 的全部功能可以在这里使用——它不能。这些设置就像它们一样愚蠢:它们是严格的逐字替换。在我看来,更好的绰号应该是“占位符分配”。

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

知道了这一点,上面使用“占位符赋值”的条目的替代方法是:

DT1 = date +%F
DT2 = 9 days ago

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

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

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

【讨论】:

    【解决方案2】:

    我不确定您是否可以在 cron 作业中执行此操作。

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

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

    在你的 cronjob 中调用这个。

    【讨论】:

    • 感谢您的意见!我认为这将是最简单的解决方法和最佳解决方案。
    猜你喜欢
    • 2021-07-29
    • 2015-04-07
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2015-07-12
    相关资源
    最近更新 更多