close

  最初用Perl來Code Generate和Parse Log,現在可以變成專案交付的程式之一了。實作兩個不錯用的工具程式,可以設定於crontab。因為沒設定Perl主題,姑且併到Regex吧!

第一個是用於偵測特定process是否陣亡,若陣亡予以重啟,並透過SMTP發Mail告警,這雖然也可以用bash辦到,但搞不好還有Run在Windows的需求。

#!/usr/bin/perl
use Net::SMTP; # Perl的SMTP套件,至少AIX有

my @procs = `ps -ef | grep MyCompany.jar`;
my $flag = '0';
for (@procs) {
    $flag = $_ unless (/grep/); # 下ps –ef | grep '關鍵字'後,連grep也是process之一,是故需予以排除
}
unless ($flag eq '0') {
    print "Running [$flag]\n";  # 找到正在Run的MyCompany.jar,不做任何處理。
} else {
    my $msg = << 'END';  # 使用Here Document,SMTP採key: value配,From和To可以省略,Subject後需空一列才是Mail內容開始
From: Jemmy <jemmy@mycompany>
Subject: Warning

MyCompany.jar is offline!! launcher.pl will start it.
END

    my $smtp = Net::SMTP->new('10.1.2.3', Timeout=>60);
    my $success = $smtp->mail('admin@mycompany');            # mail(指定寄件人)
    $smtp->recipient('Jemmy <jemmy@mycompany>', {SkipBad=>1}); # 指定收件人,用逗號分隔或用@array
    $smtp->data($msg);
    $smtp->dataend;                                          # 信件結束,相當於使用小數點(參考下文)
    $smtp->quit;
    print "Start MyCompany.jar...\n";
    system "nohup ./run.sh &"; # run.sh內容像java –jar MyCompany.jar
}

  上述的程式,是仿照使用telnet呼叫smtp的命令列,在,內容如下:

oracle10@jemmy/ogg $ telnet 10.1.2.3 smtp –> 可以進入SMTP交互命令,粗體字是由User手動輸入
Trying...
Connected to 10.1.2.3
Escape character is '^]'.
220 mycompany.com.tw ESMTP Service (Lotus Domino Release 6.5.6FP2) ready at Fri, 17 Sep 2010
10:33:10 +0800
HELO 10.1.2.3 –> 和SMTP主機打招呼
250 tpoates02.fpg.com.tw Hello 10.1.2.3 ([10.1.2.99]), pleased to meet you
MAIL From: <admin@mycompany>
250 edpadmin@edp... Sender OK
RCPT To: <jemmy@mycompany>
250 edpadmin/edp@edp... Recipient OK
DATA –> 要求輸入信件內容了,按小數點結束,上述Perl的dataend即是這種作用。
354 Enter message, end with "." on a line by itself
From: Admin <admin@mycompany>
To: Jemmy <jemmy@mycompanyp>
Subject: Test by command


Hello! Nobody but you!
.
250 Message accepted for delivery
QUIT –> 離開SMTP交互模式
221 mycompany.com.tw SMTP Service closing transmission channel
Connection closed.

此外可以在Perl使用datasend替代data,如下飯粒,只不過要小心datasend和dataend是一字之差的method:

$smtp->data();
$smtp->datasend("To: $to\n");
$smtp->datasend("Subject: $subject\n");
$smtp->datasend("\n");
$smtp->datasend("Your Message");
$smtp->dataend();

第二個是定期備份Log,是用perl呼叫Unix的tar及compress命令,應該不能移植到Windows。

#!/usr/bin/perl

chdir "/ogg/logs";
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon++;        # month base 0
$year+=1900;   # year base 1900
my $now = sprintf("%04d%02d%02d", $year, $mon, $mday);
# print "$now\n";
my @files = glob "com.systex.*.log *.gz";
my @tars = ();
for my $file (@files) {
    if ($file =~ /.+(\d{4})-(\d{2})-(\d{2})\.log(\.\d+\.gz)?/) {
        my $fdate = $1 . $2 . $3;
        if ($fdate ne $now) {
            push @tars, $file;
        }
    }
}
my $tar = "tar cvf LOG$now.tar " . join(' ', @tars);
system $tar;
system "compress LOG$now.tar ";
for my $file (@tars) {
    unlink $file or warn "$file remove error: $!\n";
}
print "finish!!\n";

Perl在日期時間的比較不甚方便,與其這樣,乾脆直接比出不等於今天的yyyy-mm-dd格式的檔案列為tar檔清單。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Jemmy 的頭像
    Jemmy

    Jemmy Walker

    Jemmy 發表在 痞客邦 留言(0) 人氣()