sshlog
msgbartop
msgbarbottom

15 Oct 08 [Perl] 檢測硬碟容量

此程式用來檢測 Linux 上機器硬碟容量,若使用量達到 95% 發 mail 通知。

#!/usr/bin/env perl
 
use Mail::Sendmail;
 
$dfs = `df -h`;
@dfs = split(/\n/,$dfs);
$size = @dfs;
 
$max = 95;
 
for ($i = 1;$i < $size; $i++) {
   @line = split(/ +/,$dfs[$i]);
   $num = $line[4];
   $num =~ s/%//g;
   if ($num > $max) {
     %mail = ( To => 'user@ms4.hinet.net',
               From => 'user@gmail.com',
               Message => 'The hard disk space is insufficient'
             );
     sendmail(%mail) or die $Mail::Sendmail::error;
 
   }

05 Oct 07 檢測程式

今天花點時間,寫了幾個檢測程式,分別是檢測硬碟使用狀況,以及主機服務是否正常。由於有申請發簡訊服務,是利用發 mail 方式,所以再寫這類程式,要考量怎麼使用簡訊功能,並不要浪費。
最簡單作法就是用 crontab 檢測這些,但是若沒有作紀錄發簡訊的次數,若又沒辦法處理時候,可能簡訊收不完,而且很快把簡訊的 Quota 用完,又是一筆錢。所以要加上發簡訊紀錄,最多發三次簡訊通知,才不會浪費。

  • 本機硬碟使用量檢測程式 – Perl 版本
  • 每四小時檢測硬碟使用狀況,若使用量超過 95% 會發簡訊以及Email 通知,最多發三次簡訊。若三次後還沒處理,一直到硬碟使用量達到100%,才會發簡訊通知硬碟滿了。硬碟滿簡訊一樣最多三次通知。

  • 檢測其他主機硬碟使用量 – Ruby 版本
  • 原本要將上面寫的 Perl 版本傳到各主機處理,但是因為 Freebsd關係,程式有點問題。山不轉路轉,改用其他方法。作法是用 Ruby 程式去抓各主機硬碟使用之資訊,並寫入 Mysql 資料庫。再分析各主機使用狀況,發簡訊方式和上面一樣,最多發三次簡訊。而用 mysql 好處是還可以紀錄上次發簡訊的時間。

  • 檢測某主機某服務使用狀態 – Ruby 版本
  • 因為要用到 mysql 資料庫,用 ruby 比較好上手。檢測某主機的服務,簡單作法是用 telnet 方式,看有沒有回應。或者用 wget 去抓取網站某一頁,看是否能抓到資料,來判斷主機是否存活。但是這兩種方式有個問題點,若主機真的掛了,用這兩個方法會等很久。所以用偷吃步方法,用 nmap 檢測。

    nmap -P0 -p 80 example.com

    這樣很快就可以知道主機回應狀況。這次發簡訊比較不同是,會先檢測三次失敗,才發簡訊。因為有時候是網路不名原因造成,這次抓不到,不代表下一次就抓不到,為了保證真的有問題,才確定發簡訊通知。另外若服務正常,也會發簡訊通知”已恢復”。避免還不知道狀況下,還衝去機房或者找電腦連線。

  • 檢測 檢測主機 狀況 – Bash Shell
  • 有時候檢測主機自己掛點了,以上服務當然也無法進行,所以要有另外一台負責監控,這次是簡單版本,所以用 Bash Shell 搞定,一樣三次簡訊通知以及成功簡訊通知。

去年也寫過類似程式,不過都是用網頁方式呈現,沒辦法達到即時。這次是因為可以用Mail 方式發簡訊,加上最近主機不是很穩定,所以重新寫一次,比較完善的作法,讓管理上也比較輕鬆。

Powered by ScribeFire.

31 May 07 Perl 連結網址

工作需要,所以要用 Perl 去連結某網址,範例程式如下:

use Net::HTTP;
my $s = Net::HTTP->new(Host => “www.perl.com”) || die $@;
$s->write_request(GET => “/”, ‘User-Agent’ => “Mozilla/5.0″);
my($code, $mess, %h) = $s->read_response_headers;

08 Mar 07 2007-3-8 Links

25 Oct 06 用 Perl 發 mail

sub send_mail {
my ($to,$subject,$body) = @_;

my $top = MIME::Entity->build(
From => “my\@email”,
To => $to,
Subject => $subject,
Bcc => “your\@email”,
Type => ‘text/html’,
Data => “$body”);

open SENDMAIL, “|/usr/sbin/sendmail -t -oi -oem”;
$top->print(\*SENDMAIL);
close SENDMAIL;
}