我有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
页面甚至根本不包含百分比字符,所以我认为它们没问题。
答案 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
子目录中的名称实际上是指向同一脚本的所有链接。