天天看點

解決cron不執行的問題

在FreeBSD5.4下面做開發,需要定期備份mysql資料,開始在網上找了bash的腳本,但是執行無效,一怒之下,使用php來寫,嘿嘿,其實php寫腳本也不錯滴。備份其實就是把mysql的資料庫檔案複制出來,當然,也可以使用mysqldump之類的工具把結果生成sql語句,不過我為了友善,就直接複制檔案,并且壓縮一下。看php代碼:

把腳本儲存到 /home/heiyeluren/db_dump/mysql_dump.php。

上面的代碼很好了解吧,就是生成一個按照時間為名字的.tgz檔案,儲存在我的個人主目錄下面,為了腳本能夠執行,還要加上 chmod +x /home/heiyeluren/db_dump/mysql_dump.php ,讓腳本能夠有執行權限。我們自己先試驗一次這個腳本,看有效沒有:

/home/heiyeluren/db_dump/mysql_dump.php

在看看有沒有生成檔案:

ls /home/heiyeluren/db_dump/

嗯,生成了 mysql_20051206_xxxxx.tgz的檔案,證明有效果。

好,切換到root使用者:su - root,輸入密碼,添加cron任務:

加入任務:

嘿嘿,設定了一分鐘執行一次,設這麼快,主要是看看有沒有效果。

等了兩分鐘,看了一下,嗯?怎麼在 /home/heiyeluren/db_dump/下面還是沒有 .tgz 的檔案?怎麼回事呢?

刷刷列了好幾螢幕,看到類似這樣的:

Dec 6 19:32:00 BSD /usr/sbin/cron[12256]: (root) CMD (/usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php > /dev/null)

證明我的腳本執行了。。。但是為什麼沒有效果呢?

哦,我想起來了,好像cron能夠把腳本中的輸出當作郵件發送給建立cron的使用者,嗯,好,我們去掉 > /dev/null 這段,就讓我們cron直接發送郵件給我們的root:

crontab -e

修改為:

*/1 * * * * /usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php

等了一會,看一下郵件,可以使用mail指令來看,也可以直接在 /var/spool/clientmqueue/ 下面看,我們選擇第二種:

ls /var/spool/clientmqueue/

列出好多檔案:

dfjB6BG0SE012107 dfjB6BN0JP012185 

dfjB6BU1mj012248 qfjB6BG0SE012107 

qfjB6BN0JP012185 qfjB6BU1mj012248

dfjB6BH0aP012123 dfjB6BO1ID012192 

dfjB6BV0dL012254 qfjB6BH0aP012123 

qfjB6BO1ID012192 qfjB6BV0dL012254

我們打開一個來看:

cat /var/spool/clientmqueue/dfjB6BG0SE012107

嗯,看到輸出:

sudo: not found

???難道是我們的php腳本有問題,不是我測試過沒有問題的嗎?哦,看提示,原來是sudo指令沒有找到,為什麼呢?因為所有腳本中引用的程式都必須是絕對路徑滴,不然會找不到,唉,犯錯了。

嗯,既然我是用root執行的,權限是沒有問題滴,何不把sudo給删除呢,說幹就幹,修改腳本:

vi /home/heiyeluren/db_dump/mysql_dump.php

嘿嘿,去掉了sodu,嗯,儲存退出,看看我們的crontab效果如何。。。

哈哈,一分鐘過後,檢視下目錄:

ls /home/heiyeluren/db_dump

嘿嘿,有兩個 .tgz 的檔案了:mysql_20051206_xxxx.tgz,嗯,證明成功了,但是不能總是讓cron給root發郵件呀,不然一會功夫伺服器空間就沒有了,修改cron任務為:

0 6 * * * /usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php > /dev/null

就是每天早上的六點執行一次,并且把任何輸出到輸出到 /dev/null 中,不要給root發郵件。

好,終于解決,不容易,涉及很多知識電,不過增長了經驗,不是嗎?

非學,無以緻疑;非問,無以廣識