問題
我在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命令錯用導致的問題