最近寫了一個 監控在線進程的程序. 目的是為了 能實時監控執行程序是否斷線,並及時重啟。
用PHP寫的,不算難,還成,但對於自己來講挺有成就感的。
程序部分略省。
#將perl進程指向到一個文本中。 $psfile
$command = "ps ax | grep perl | grep -v \"> $psfile\" >$psfile";
exec($command);
$process_array = file($psfile); #打開文本
$sum_process = sizeof($process_array); #文本的每一行作為數組元素,此sizeof 則是 取元素個,即行數。
for ($i=0 ; $i < $sum_process ; $i++)
{
echo $process_array[$i]."\n"; #$process_array[$i] 為文本中i行的記錄
echo $province_id[$PID]."\n";
if(strstr($process_array[$i],$province_id[$PID])) # 對比是否存在進程
{
echo "有進程\n";
$thread=1;
break;
}
}
$command = "perl ".$program." > ".$phppath.$name."abc.txt &"; #重起進程命令
system($command); #重起進程
特別說明:
1. 命令 ps ax | grep perl | grep -v "> $psfile" >$psfile
很奇怪: ps ax|grep perl > abc.dat (命令正確) 在sh裡執行 與 用PHP 執行 輸出結果會不同,所以需要加入 一個 管道 | grep -v "> $psfile" 就可以。大致作用是-v 不匹配$psfile 而且其他的輸出。 具體原因不明挺奇怪的。
2. system() 函數
PHP的此函數有個毛病 ~ 是執行時,它必須把當前的進程程序執行完後才會跳出,繼續循環下一個需要重啟的程序,就是說 如果有多個進程需要重啟的話,那麼此函數只能是一直等待 當前的進程程序執行完,才能重啟下一個。。。。。。。。。。。。(汗顏)
解決方案: 將命令 寫成後由後台執行。 就是---》 多加一個 & (別小看這個~ 可解決了大問題)
例 : perl abc.pl > abc.dat &
OK~
大功告成! ~^-^~