我的 cronjob 语法有什么问题,我试图使用反引号(`)?

我的 cronjob 语法有什么问题,我试图使用反引号(`)?

以下是我想要自动化的内容:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +%Y-%m-%dZ%I:%M`"

错误信息如下:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

答案1

crontab(5)

“第六个”字段(行的其余部分)指定要运行的命令。行的整个命令部分(直到换行符或 % 字符)将由 /bin/sh 或 crontab 文件的 SHELL 变量中指定的 shell 执行。除非使用反斜杠 () 进行转义,否则命令中的百分号 (%) 将更改为换行符,并且第一个 % 之后的所有数据将作为标准输入发送到命令。没有办法将单个命令行拆分为多行,就像 shell 的尾随“\”一样。

只需在 % 符号前添加反斜杠:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

答案2

解决问题转义 % 字符date +%Y-%m-%d应该date +\%Y-\%m-\%d

不幸的是,这个答案有点晚了,但问题不是 PATH 或反引号 - 问题只是百分比字符 '%' 是用于表示 crontab 条目中的 NEWLINE 或 STDIN 的特殊字符

这与命令的格式输入相冲突date。因此,包含以下内容的命令date +%Y-%m-%d将被解释为:

date Y- m- d

答案3

我也遇到了很多与反引号有关的问题。有时你需要多次出现引号和反引号。只需将它们替换为 $()​​ 即可。

例子:

export NOW=`date`
by
export NOW=$(date)

-吉尔森·索亚雷斯

答案4

这与 backsticks 无关。糟糕的是 cron 看不到 PATH,而您必须在 cron 脚本中反复告诉 cron“PATH 是什么?”。

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

我赞成将命令写在文件中,而不是在 cron 行中逐字传递命令。更优雅的做法是

* * * * * /your/script/here

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

这些行可以进入一个文件,chmod +x 文件,然后调用这个文件。

相关内容