記一次crontab中date命令錯用導致的問題

pythontab發表於2019-11-18

問題

我在crontab中新增一條定時任務如下,用於每天把舊日誌移到指定目錄:

0 0 * * * cd /home/vg/odp/log && mv *`date -d "-10 day" "+%Y%m%d"`* archives

然後這個定時任務似乎沒有生效。單獨執行後面的命令都是成功的沒有報錯。

原因追蹤

crontab的執行情況,linux都會給對應的使用者發郵件,因此可以透過郵件來定位問題。上面的任務在vg使用者下,檢視對應的郵件 /var/spool/mail/vg , 找到和出問題的任務相關的內容如下:

From root@MyServer.localdomain Tue May 14 18:00:01 2019
Return-Path: X-Original-To: vg
Delivered-To: vg@MyServer.localdomain
Received: by MyServer.localdomain (Postfix, from userid 500)
id 694075F2AD; Tue, 14 May 2019 18:00:01 +0800 (CST)
From: root@MyServer.localdomain (Cron Daemon)
To: vg@MyServer.localdomain
Subject: Cron  cd /home/vg/odp/log && mv *`date -d "-10 day" "+
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: Date: Tue, 14 May 2019 18:00:01 +0800 (CST)
/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

上面清楚地記錄了出錯原因:unexpected EOF while looking for matching ``' 看報錯得知還沒有匹配到`命令就結束了,問題看似奇怪,因為定時任務命令單獨拿出來執行是沒有問題的,再仔細看郵件內容,Subject那一行:

Subject: Cron cd /home/vg/odp/log && mv *`date -d "-10 day" "+

顯示的命令不全,到加號就結束了,%和後面的部分丟失了,結合報錯基本可以定位原因,%是crontab裡的特殊符號,表示新的一行開始,所以前面的命令就被截斷了。

解決方式

如果crontab執行的命令中包含%需要用\轉義,上面的例字改成這樣就可以成功執行:

0 0 * * * cd /home/vg/odp/log && mv *`date -d "-10 day" "+\%Y\%m\%d"`* archives


文章轉自:DaemonCoder 記一次crontab中date命令錯用導致的問題


相關文章