7

我有一个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页面根本不包含百分号,所以我认为它们没问题。

4

2 回答 2

12

您必须使用反斜杠转义百分号:

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

来自man 5 crontab

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

于 2008-12-12T15:22:34.107 回答
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子目录中的名称实际上都是指向同一个脚本的链接。

于 2008-12-12T15:51:35.170 回答