乙個**要能正常運轉起來,定時任務是必不可少的。要知道定時任務程式是否正確執行,要麼每天去看日誌檔案,要麼讓監控程式幫你盯著它們。
ror的rake程式,用來排程任務指令碼,可以很方便地在任務開始、結束、發生錯誤時插入hook,從而實現job監控的目的。php沒有像rake這樣的程式來排程任務,所以下面自己寫乙個。
目錄結構:
jobs
|--tasks
| |--test.php
|--wake.php
其中jobs/tasks/test.php的內容如下:
<?php
print_r($argv);
?>
假設當前目錄在jobs下,所有的 job 指令碼存放在tasks資料夾下,如果要執行tasks/test.php,通常是這麼執行的:
php tasks/test.php a b c
結果如下:
array
([0] => tasks/test.php
[1] => a
[2] => b
[3] => c
)
現在我們要對這個job進行監控,需要記錄它開始執行的時間,結束執行的時間,執行時發生的錯誤(如果有)以及丟擲的異常(如果有),並且不能對現有的job指令碼做太多的修改。wake.php就是本文的主角,它作為任務指令碼的排程器,完成以上的需求。ror中排程任務的程式叫rake,cakephp中console命名叫bake,我這裡叫wake好了,喚醒的意思,意指喚醒具體的job。使用方式如下:
php wake.php test a b c
wake.php內容:
<?php
/*** @author lorienliu
** 啟動job,監控job執行時發生的錯誤以及丟擲的異常,記錄開始和結束時間。
*///引數處理
array_shift($argv);
if (count($argv) == 0)
$job_name = $argv[0];
$job_file_path = dirname(__file__) . '/tasks/' . $job_name . '.php';
// 處理錯誤
function error_handler($errno, $errstr, $errfile, $errline)
function start_job()
//結束job,可以在具體job中呼叫,實現程式正常終止
function end_job()
function error_job($errno = 0, $errstr = '', $errfile = '', $errline = '')
set_error_handler('error_handler');
start_job();
try catch (exception $e)
end_job();
?>
---- 2013-06-08 02:36:02 job start : test ----
array
([0] => test
[1] => a
[2] => b
[3] => c
)---- 2013-06-08 02:36:02 job end : test ----
修改tasks/test.php內容,丟擲異常:
<?php
print_r($argv);
throw new exception("a custom exception");
?>
執行結果:
修改tasks/test.php內容,使得發生錯誤,這裡引入乙個不存在的檔案:
<?php
print_r($argv);
require_once dirname(__file__) . '/abc.php';
?>
結果如下:
可以見到,無論異常或者錯誤,wake.php都能夠捕獲。關鍵在於用try catch來處理異常,用set_error_handler來處理錯誤。這裡有幾個hook,start_job, end_job, error_job,可以在這些hook中新增某些操作,記錄這些job的執行資訊,方便統計分析。
sparkStreaming 任務監控
背景 公司一般做業務監控都是採用實時任務的方式,實時任務的可用性就更加需要保障了。監控指令碼 bin bash 去azkaban資料庫獲取所有的實時任務名稱,stream開頭的 stream.sql use azkaban select name from azkaban.projects wher...
crontab機會任務監控
1 如何檢視自己的計畫任務是否成功的執行?昨天crontab中的同步任務沒有執行,不知道是什麼原因沒有執行,貌似任務hang住了,想查詢一下crontab到底問題出在 或者hang在了什麼地方。1.linux 看 var log cron這個檔案就可以,可以用tail f var log cron觀...
監控任務的設計思路
這裡就不畫圖了,文字表述即可。假如現在有好幾個業務子系統共同完成乙個任務,當大量的任務來臨時,怎麼去保證每個任務都能跑完?這就需要我們對任務進行監控,我的思路是這樣的 建立乙個新的監控專案,定時遍歷資料庫的任務表,看看有沒有新來的任務,有的話取出來,加入乙個待執行佇列,並計算超時時間,再開乙個執行緒...