一、背景
有個小需求,所以寫了個指令碼,指令碼會把執行成功的數量記錄下來,寫到檔案(successNumber)中。這個指令碼需要執行很長的時間,為了防止程式中斷,所以在crontab加了定時任務。
* * * * * root /usr/local/bin/php /home/chy/test/test.php >>/tmp/chy_test 2>&1
第一天晚上搞好,在自己目錄執行了下符合預期,successNumber檔案的資料也正常更新到212了,然後看了下定時任務也啟動起來就開開心心的回家了。
第二天來了一看,successNumber竟然還是212,難道說一晚上的時間都沒有正常執行?突然間有點慌,然後仔細排查了下:
二、排查過程
ps aux|grep test.php ———>程式還在
ll /tmp/chy_test ———>更新時間也正常
tail -f /tmp/chy_test ———>還在正常輸出日誌
咦?那麼我執行成功的數量到底記錄到哪裡了??
三、找到Bug
仔細看了下程式碼,找到記錄資料的這部分程式碼
echo "成功!\n";
$successNumber++;
file_put_contents('successNumber', $successNumber);
不得不說,還是個老生常談的問題,由於開發的比較簡略,所以當時考慮將結果記錄到同目錄的successNumber這個檔案裡,但是如果用定時指令碼啟動的話,那麼並不會把資料存入到/home/chy/test/successNumber
中。
很早很早之前,就被教育過,定時指令碼的路徑要寫成絕對路徑,相對路徑有可能出現問題的。
以後還是要仔細+仔細呀,不能犯這種低階Bug。
不過,話說回來,資料到底寫到哪裡去了?
四、破案
現在的問題就是要找到對於定時任務來說,哪裡是根目錄,那麼我的successNumber肯定就在根目錄那邊!
上網查了下資料,發現解鎖了個盲區,之前看到crontab的頂部有幾行程式碼一直不解其意,只知道缺少這幾行定時任務不會執行,這次終於明白了:
SHELL=/bin/bash \\指定了系統要使用哪個shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin \\系統執行 命令的路徑
MAILTO=root \\執行資訊將通過電子郵件傳送給root使用者,如果MAILTO變數的值為空,則表示不傳送任務執行資訊給使用者
HOME=/ \\指定了在執行命令或者指令碼時使用的主目錄
於是終於找到我的成功資料了/successNumber
五、總結
1.牢記定時指令碼里的路徑要寫成絕對路徑。
2.還算有所收穫,瞭解了crontab的配置含義。
3.遇到問題還是要多想想,深入挖掘下
本作品採用《CC 協議》,轉載必須註明作者和本文連結