平常小Bug之數據寫到哪去了

1、背景

有個小需求,因此寫了個腳本,腳本會把執行成功的數量記錄下來,寫到文件(successNumber)中。這個腳本須要運行很長的時間,爲了防止程序中斷,因此在crontab加了定時任務。php

* * * * * root /usr/local/bin/php /home/chy/test/test.php  >>/tmp/chy_test 2>&1
複製代碼

第一天晚上搞好,在本身目錄運行了下符合預期,successNumber文件的數據也正常更新到212了,而後看了下定時任務也啓動起來就開開心心的回家了。shell

次日來了一看,successNumber居然仍是212,難道說一夜的時間都沒有正常執行?忽然間有點慌,而後仔細排查了下:bash

2、排查過程

ps aux|grep test.php --------->進程還在ui

ll /tmp/chy_test --------->更新時間也正常spa

tail -f /tmp/chy_test --------->還在正常輸出日誌日誌

咦?那麼我執行成功的數量到底記錄到哪裏了??code

3、找到Bug

仔細看了下代碼,找到記錄數據的這部分代碼進程

echo "成功!\n";
$successNumber++;
file_put_contents('successNumber', $successNumber);
複製代碼

不得不說,仍是個老生常談的問題,因爲開發的比較簡略,因此當時考慮將結果記錄到同目錄的successNumber這個文件裏,可是若是用定時腳本啓動的話,那麼並不會把數據存入到/home/chy/test/successNumber中。crontab

很早很早以前,就被教育過,定時腳本的路徑要寫成絕對路徑,相對路徑有可能出現問題的。開發

之後仍是要仔細+仔細呀,不能犯這種低級Bug。

不過,話說回來,數據到底寫到哪裏去了?

4、破案

如今的問題就是要找到對於定時任務來講,哪裏是根目錄,那麼個人successNumber確定就在根目錄那邊!

上網查了下資料,發現解鎖了個盲區,以前看到crontab的頂部有幾行代碼一直不解其意,只知道缺乏這幾行定時任務不會執行,此次終於明白了:

SHELL=/bin/bash   \\指定了系統要使用哪一個shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin \\系統執行 命令的路徑
MAILTO=root   \\執行信息將經過電子郵件發送給root用戶,若是MAILTO變量的值爲空,則表示不發送任務執行信息給用戶
HOME=/        \\指定了在執行命令或者腳本時使用的主目錄

複製代碼

因而終於找到個人成功數據了/successNumber

5、總結

1.牢記定時腳本里的路徑要寫成絕對路徑。

2.還算有所收穫,瞭解了crontab的配置含義。

3.遇到問題仍是要多想一想,深刻挖掘下

相關文章
相關標籤/搜索