2023年7月18日 星期二

我的 cron 為什麼不會動?

這幾天在設定一部新的伺服器。 建立一個檔案 /etc/cron.daily/backup.sh 把一些備份的指令寫在裡面。 兩三天下來卻一直沒等到備份檔的出現。

查看 cron 的 log 檔: journalctl _COMM=cron 看到這樣的內容:

Jul 13 05:17:01 ckhung CRON[2075]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 13 05:17:01 ckhung CRON[2076]: (root) CMD (cd / && run-parts --report /etc/cron.hourly)
Jul 13 05:17:01 ckhung CRON[2075]: pam_unix(cron:session): session closed for user root
Jul 13 06:17:01 ckhung CRON[2079]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 13 06:17:01 ckhung CRON[2080]: (root) CMD (cd / && run-parts --report /etc/cron.hourly)
Jul 13 06:17:01 ckhung CRON[2079]: pam_unix(cron:session): session closed for user root
Jul 13 06:25:01 ckhung CRON[2084]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 13 06:25:01 ckhung CRON[2085]: (root) CMD (test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.daily; })
Jul 13 06:25:01 ckhung CRON[2084]: pam_unix(cron:session): session closed for user root
Jul 13 07:17:01 ckhung CRON[2139]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 13 07:17:01 ckhung CRON[2140]: (root) CMD (cd / && run-parts --report /etc/cron.hourly)
Jul 13 07:17:01 ckhung CRON[2139]: pam_unix(cron:session): session closed for user root

為什麼系統執行 cron.hourly 的指令跟執行 cron.daily 的指令不一樣啊? 原來 anacron 的目的是用來補原始 cron 的不足: 如果你的電腦不是 24 小時開機 (不是伺服器), 那麼 ancron 可以確保每次開機時都把先前遺漏的工作補足, 不過它會忽略 cron.hourly 的部分。 先確認一下我到底有沒有安裝 anacron: dpkg -l | grep -i cron ; ls -l /usr/sbin/anacron 果然沒有。 那就來手動執行後半部試試看... 叫它多印一些訊息: run-parts --verbose /etc/cron.daily 咦, 為什麼沒有執行我的 backup.sh? 權限都正確啊?

-rwxr-xr-x 1 root root  539 Jun  9  2022 apache2
-rwxr-xr-x 1 root root 1478 May 25 22:11 apt-compat
-rwxr-xr-x 1 root root  285 Jul 16 09:49 backup.sh
-rwxr-xr-x 1 root root  123 Mar 27 08:41 dpkg
-rwxr-xr-x 1 root root  377 Dec 15  2022 logrotate
-rwxr-xr-x 1 root root 1395 Mar 13 06:23 man-db
只是檔名長得跟別人不一樣... 把檔名改成 backup, 結果竟然就可以執行了! 搜尋到 這個 bug report, 原來是因為 debian 會在某些 (不見得是 cron 的) 目錄留下 *.dpkg-* 這類的檔案, run-parts 指令想要避開, 所以不會執行檔名當中有句點的檔案。 run-parts 的手冊裡有寫喔! 靠 google 繞了一大圈才認真讀, 真是太習慣捨近求遠了啊!

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。