2012-06-08 54 views
0

我正在ping一個網站並檢查可用性,並僅在發送電子郵件時發送電子郵件。 (這部分是根據下面的代碼工作得很好。)如何指導Perl腳本檢查網站響應?

require LWP::UserAgent; 
my $ua = LWP::UserAgent->new; 
$ua->timeout(20); 
my $response = $ua->get('https://www.Mysite.net/websuite/'); 
if (! $response->is_success) { 
    #print 'CMM Is up and Running'; 
    $path = "C:\\prac\\send_email_failure.ps1"; 
    $pwspath = "c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe"; 
    system("$pwspath -command $path"); #using powershell to invoke email utility  
} 

現在,我正在努力擴大劇本,看其是否

  1. 可以檢查一次,它的下跌和發送電子郵件(現在正在進行),並且在收到電子郵件之前不要發送電子郵件。順便說一下,我使用Windows任務計劃程序每20分鐘運行腳本。

  2. 當它看到網站已經啓動後,它應該進行正常的過程,檢查網站是否再次關閉併發送電子郵件(例如網站已關閉然後再次購買並再次下載)。我使用任務計劃程序每20分鐘運行腳本。

任何幫助表示讚賞。

+0

你可能會更好地安裝類似nagios或monit的東西。這些功能可讓您監控各種服務併發送警報或執行其他操作(例如,重新啓動服務)。 –

+0

我認爲你必須在什麼地方存儲最後一次嘗試的狀態。然後,如果last_attemps成功並且當前嘗試失敗,則發送電子郵件。 – nico

回答

1

如果您的腳本是從某種調度程序執行的,則需要以某種方式持久保存上次請求的狀態。例如,您可以創建一個標記最後狀態爲「關閉」的文件。

或者您可以簡單地將腳本作爲守護進程運行並安排每20分鐘檢查一次(例如使用AnyEvent)。這樣你就不必應付文件系統相關的問題。

use LWP::UserAgent; 
use AnyEvent; 

my $previous = 1; 
my $watch = AnyEvent->timer(interval => 1200, cb => sub { 
     if(check_status() == 0) { 
      if($previous == 1) { 
       # send e-mail 
      } 
      $previous = 0; 
     } 
     else { 
      $previous = 1; 
     } 
    }); 

AnyEvent->condvar->recv; 

sub check_status { 
    my $ua = LWP::UserAgent->new(timeout => 20); 
    my $response = $ua->get('...'); 
    return $response->is_success ? 1 : 0; 
} 
+0

如果您想嘗試此代碼示例,您需要[安裝](http://www.cpan.org/modules/INSTALL.html)CPAN的AnyEvent模塊。 –