作者 主題: cron 使用經驗分享  (閱讀 11190 次)

0 會員 與 1 訪客 正在閱讀本文。

jerryhuang

  • 憂鬱的高中生
  • ***
  • 文章數: 173
    • 檢視個人資料
cron 使用經驗分享
« 於: 2003-06-03 03:18 »
cron 的初始設定
cron有幾個變數有其內定的初始值,如 SHELL 一定是/bin/sh,
HOME, LOGNAME (USER)則是看/etc/passwd 裡的設定值。
MAILTO 則是該crontab 的所有人, 也就是LOGNAME 。
PATH /usr/bin:/bin (這點我不確定, Linux 找不到設定的地方,但 Solaris 則可以
在 /etc/default/cron 設定)
當然這些全都是可以改的,只要在你的 crontab 加入這些設定項就可以了。如
SHELL=/bin/csh
HOME=/tmp
PATH=/usr/sbin:/usr/bin:/bin:/sbin
MAILTO=abc@abc.com
0 0 * * * runsomething

cron 的輸出
cron 的 log 在 /var/log/cron 下( solaris 在 /var/cron 下)
它只記載了 crontab 修改和執行的記錄,並不會記錄你丟到 cron 跑的程式的輸出
,但cron 預設只要你的程式有輸出( 標準輸出和標準錯誤 ),都會寄給 MAILTO
所指定的人,這對除錯就很有用了。或著可以用輸出重導來幫我們除錯。
0 0 * * * { date; sh -x myscript; echo; } >> cron.output 2>&1
當你不想再看到任何的輸出時,再修改你的crontab 把它們重導到 /dev/null 去。

cron 的備份
備份
crontab -l > mycron.txt
還原
crontab mycron.txt

cron 的注意事項
1. crontab 的最後一欄指令最好使用絕對路徑,並確定該script 有 x 的權限。
2. crontab 不可含有空白行,每列開頭不可是空白字元(space, tab)
3. 注意 /etc/cron.deny & /etc/cron.allow 的設定
4. 帳號過期或遭鎖定, cron 會無法執行。

cron 辦不到的事
我要如何在每個月的最後一個星期六或者每個月的最後一天跑我的程式呢?
答案是沒有直接的方法,但我們可以寫個script 來達到我們的目的。
下面二個script 可以幫你算出一年12個月的最後一天並產生crontab 的format。
#!/bin/bash
#filename: lastday.sh
cal $1 $2 |awk '/[23][0189]/{printf $NF"\n"}'|tail -1

#!/bin/bash
#filename: ld2cf.sh
min=0
hour=0
comm="ls > /dev/null 2>&1"
for mon in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
    day=`sh ./lastday.sh $mon $1`
    echo "$min $hour $day $mon * $comm"
done

#crontab -l > mycron.txt
#sh ld2cf.sh 2003 >> mycron.txt
#crontab mycron.txt

至於每個月的最後一個星期六我曾經貼過
http://phorum.vbird.idv.tw/viewtopic.php?t=4723&highlight=cron&sid=b2bc3687334d57f5d6a7758126dcbe34
但是在寫每月最後一天時我想到有更簡單的方法,一行就搞定了。(那個時候我怎麼那麼笨,竟然沒想到)
0 0 28,29,30,31 * * [ `date '+%a'` == 'Sat' ] && myscript
只要在 command 欄動點手腳就可以了,用 test 來檢查是否是我們指定的星期幾,成立後再執行後面的 myscript 。
以上是我曾經犯過的錯,或是遭遇到的一些情況的解決方法,給大家做個參考。

rubc

  • 可愛的小學生
  • *
  • 文章數: 11
    • 檢視個人資料
Re: cron 使用經驗分享
« 回覆 #1 於: 2003-06-25 21:47 »
cron 的輸出
cron 的 log 在 /var/log/cron 下( solaris 在 /var/cron 下)
它只記載了 crontab 修改和執行的記錄,並不會記錄你丟到 cron 跑的程式的輸出
,但cron 預設只要你的程式有輸出( 標準輸出和標準錯誤 ),都會寄給 MAILTO
所指定的人,這對除錯就很有用了。或著可以用輸出重導來幫我們除錯。
0 0 * * * { date; sh -x myscript; echo; } >> cron.output 2>&1
當你不想再看到任何的輸出時,再修改你的crontab 把它們重導到 /dev/null 去。



那麼請問一下:假如我把Sendmail的功能關了,是不是就不能發信了呢??