日常小 Bug 之資料寫到哪去了

caohaoyu發表於2020-02-29

一、背景

有個小需求,所以寫了個指令碼,指令碼會把執行成功的數量記錄下來,寫到檔案(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 協議》,轉載必須註明作者和本文連結

相關文章