PHP Job任務監控

2021-09-01 18:50:32 字數 2437 閱讀 8345

乙個**要能正常運轉起來,定時任務是必不可少的。要知道定時任務程式是否正確執行,要麼每天去看日誌檔案,要麼讓監控程式幫你盯著它們。

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觀...

監控任務的設計思路

這裡就不畫圖了,文字表述即可。假如現在有好幾個業務子系統共同完成乙個任務,當大量的任務來臨時,怎麼去保證每個任務都能跑完?這就需要我們對任務進行監控,我的思路是這樣的 建立乙個新的監控專案,定時遍歷資料庫的任務表,看看有沒有新來的任務,有的話取出來,加入乙個待執行佇列,並計算超時時間,再開乙個執行緒...