对cron执行的命令有特殊限制吗?

时间:2008-12-12 15:16:11

标签: linux unix cron

我有crontab看起来像

0 0 * * * pg_dump DB_NAME > /path/to/dumps/`date +%Y%m%d`.dmp

在我手动运行时工作正常,但在cron运行时却没有。挖掘完日志后,我看到了

Dec 12 00:00:01 localhost crond[17638]: (postgres) CMD (pg_dump DB_NAME > /path/to/dumps/`date +)

看起来像百分号的问题,但man页面甚至根本不包含百分比字符,所以我认为它们没问题。

2 个答案:

答案 0 :(得分:11)

你必须用反斜杠来逃避百分号:

0 0 * * * pg_dump DB_NAME > /path/to/dumps/`date +\%Y\%m\%d`.dmp

来自man 5 crontab

  

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

答案 1 :(得分:3)

与命令行相比,还有另一个可能会影响由cron运行的程序的特征问题(除了Robert Gamble描述的'%'符号的解释之外)。

这种差异在于环境。如果程序运行依赖于特殊的环境变量,那么当您从命令行运行它时,它将适用于您通常使用的环境,如果您使用at运行它,它可能会起作用,因为它捕获了环境当你创建工作。但cron没有特殊的环境设置。

因此,我习惯性地将cron配置为按绝对路径名运行脚本,并且该脚本执行我需要的环境设置(例如,将我的$HOME/bin目录添加到PATH)。我甚至有一个标准化的基础设施 - 一个设置环境并运行其他程序的shell脚本。

#   @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
#   Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min     Hour    Day     Month   Weekday Command
#-----------------------------------------------------------------------------
0        *       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1        1       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23       1       *       *       1-5     /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2        3       *       *       0       /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21       3       1       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/monthly

/work1/jleffler/bin/Cron中的脚本设置环境,然后在/work1/jleffler/bin中运行同名脚本来完成实际工作。 Cron子目录中的名称实际上是指向同一脚本的所有链接。