最初用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檔清單。