2008-12-12 55 views
5

我有一個crontab看起來像對cron執行的命令是否有特殊限制?

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頁面甚至不包含百分號可言,所以我以爲他們是正常的。

回答

10

你必須使用反斜線百分號:

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

man 5 crontab

的'六'域(該行的其餘部分)指定的命令 是 運行。該行的整個命令部分(最多爲 換行符或% 字符)將由/ bin/sh或由crontab文件的 SHELL變量中指定的shell執行。百分之-體徵(%)在 命令,除非 與反斜槓轉義(\),將被改變成新行字符 ,並且第一後%的所有數據將作爲 標準輸入被髮送到命令 。沒有辦法將單個命令行 分割爲多行,如shell的尾部「\」。

+0

你是對的。我看着錯誤的man頁面(只是man crontab而不是man 5 crontab)。 – 2008-12-12 15:28:44

3

有可能會影響通過cron運行的程序與命令行(比由羅伯特寶潔描述「%」的招牌解釋等)相比的另一個特點問題。

不同之處在於環境。如果程序運行依賴於特殊的環境變量,那麼當它通過命令行運行並且通常使用的環境時,它就會工作,如果你使用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子目錄中的名稱實際上是到同一腳本的所有鏈接。