解決cron不執行的問題

2021-04-16 07:43:16 字數 2801 閱讀 7867

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

#!/usr/local/php/bin/php

$date = "mysql_". date("ymd_his");

$cmd = "sudo /usr/bin/tar -cf /home/heiyeluren/db_dump/".$date.".tgz /usr/local/mysql/var/";

system($cmd);

?>

把指令碼儲存到 /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_***xx.tgz的檔案,證明有效果。

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

crontab -e

加入任務:

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

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

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

檢視cron的日誌:

cat /var/log/cron

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

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

修改為:

#!/usr/local/php/bin/php

$date = "mysql_". date("ymd_his");

$cmd = "/usr/bin/tar -cf /home/heiyeluren/db_dump/".$date.".tgz /usr/local/mysql/var/";

system($cmd);

?>

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

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

ls /home/heiyeluren/db_dump

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

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

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

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

(好久沒寫blog,自責一下!)

解決cron不執行的問題

在freebsd5.4下面做開發,需要定期備份mysql資料,開始在網上找了bash的指令碼,但是執行無效,一怒之下,使用php來寫,嘿嘿,其實php寫指令碼也不錯滴。備份其實就是把mysql的資料庫檔案複製出來,當然,也可以使用mysqldump之類的工具把結果生成sql語句,不過我為了方便,就直...

解決cron不執行的問題

在freebsd5.4下面做開發,需要定期備份mysql資料,開始在網上找了bash的指令碼,但是執行無效,一怒之下,使用php來寫,嘿嘿,其實php寫指令碼也不錯滴。備份其實就是把mysql的資料庫檔案複製出來,當然,也可以使用mysqldump之類的工具把結果生成sql語句,不過我為了方便,就直...

解決ROS rqt 不能執行的問題,不徹底

環境ubuntu 16.04,qt 5.7.1,python2.7,kinect ros,執行ros時,需要rqt console等,但出現如下錯誤 traceback most recent call last file opt ros kinetic bin rqt console line 8...