对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页甚至没有包含百分比字符,所以我认为他们是没问题的。

Solutions Collecting From Web of "对cron执行的命令是否有特殊限制?"

你必须用反斜杠来转义百分号:

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

man 5 crontab

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

与命令行相比,还有另一个可能影响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运行相同名称的脚本来完成实际工作。 Cron子目录中的名称实际上是到同一个脚本的所有链接。