在 UNIX/Linux 系統的自動化管理中,利用腳本自動發送郵件的功能對系統監控的工作來說是非常重要的。系統管理人員可以利用 cron 或者 RMC 來創建監控腳本,一旦觸發條件被滿足,操作系統就會自動創建電子郵件,將相關的狀態信息發送到指定的郵箱。通過電子郵件系統,系統管理人員就能夠及時得獲取被管理系統的狀態,進而采取相應的措施。這種方式可以顯著地節省系統管理人員的工作強度,並能夠提高系統的可維護性。
Unix/Linux 郵件系統組成簡介
在傳統的 UNIX 和 Linux 系統中,電子郵件系統的主要組成部分包括郵件用戶代理 (MUA -- mail user agent)、郵件傳輸代理(MTA -- mail transfer agent)、郵件提交代理 (MSA -- mail submission agent)、郵件投遞代理 (MDA -- mail delivery agent) 和郵件訪問代理 (MAA -- mail access agent)。在日常工作中,系統管理人員經常接觸的主要有郵件用戶代理 (MUA) 和郵件傳輸代理 (MTA)。在 AIX 系統中,一個典型的郵件系統如圖 1 所示。
圖 1. 郵件系統示意圖
郵件用戶代理(MUA)是一個用來讀寫 mail 的程序,實際上就是郵件系統的客戶端程序。它提供了閱讀,發送和接受電子郵件的用戶接口。最常用的郵件用戶代理有 mutt,mail,elm,pine,它們都是隨基本系統安裝的 簡單郵件應用程序
。
郵件傳輸代理(MTA)是一個在兩個主機之間或者本地同一主機內傳送郵件的程序,它負責郵件的存儲和轉發,並決定傳送郵件到目的地的路線。UNIX/Linux 系統的標准 MTA 是 sendmail,其他的 MTA 還有 qmail, exim 和微軟的 Exchange。MTA 會監視用戶代理的請求,根據電子郵件的目標地址找出對應的郵件服務器,在服務器之間傳輸郵件並將接收到的郵件進行緩沖。
郵件投遞代理(MDA)通常被 MTA 用來投遞郵件到接收者的郵箱中。它能夠從 MTA 接收郵件,並根據指定的規則來進行本地投遞;它可以把郵件投遞到本地用戶、郵件列表、文件或者應用程序。UNIX/Linux 系統中常用的 MDA 包括 maildrop、procmail、postfix 和 delivermail 等。Postfix 用一個或多個 MDA 來遞送郵件 , procmail 是另外一個有名的 MDA.
郵件提交代理(MSA)負責消息發送之前的所有必須完成的准備工作和錯誤檢測。MSA 就如同在 MUA 和 MTA 之間的一個頭腦清醒的檢測人員,它會對所有的主機名和從 MUA 得到的信息頭等信息進行檢測。
MAA 郵件訪問代理(MAA)將用戶連接到郵件系統,並通過 POP 或 IMAP 協議來收取郵件。UNIX/Linux 系統中,常用的 MAA 有 UW-IMAP、Cyrus-IMAP、COURIER-IMAP 等;當郵件向目的地址進行傳輸時,一旦源地址和目的地址都不是本地系統,那麼本地系統就會作為郵件的中繼。
對於大多數郵件用戶來說,利用郵件客戶端來接收、查看和發送電子郵件是最常用的功能。接收和查看郵件比較簡單,但是電子郵件的發送則相對復雜。在下面的章節裡面,本文將根據不同的操作系統來具體介紹如何配置郵件服務器。
發送郵件代理配置及自動化發送
Linux 的 sendmail 配置
配置文件
在 Linux 系統中,Sendmail 包括如下配置文件:
我們將會 在
下面的章節中詳細介紹這些配置文件。
/etc/sendmail.cf
/etc/sendmail.cf 是 sendmail 的主配置文件。該文件存儲了正在運行的 mailer 程序的類型信息,定義了重寫郵件地址的規則和 sendmail 命令的操作環境。因為 sendmail.cf 的語法比較復雜,我們一般不建議手動修改該配置文件。安裝了 sendmail 的 UNIX/Linux 系統都會帶有 sendmail.cf,而且該配置文件在大多數情況下都不需要修改就可以使用。如果用戶確實需要修改 sendmail.cf 配置文件 , 一般建議用戶基於 sendmail.mc 宏文件,利用 m4 程序來生成新的 sendmail.cf 文件。
在 RedHat Linux 系統中,sendmail.mc 宏文件位於 /etc/mail/ 目錄。
而 SuSE Linux 系統並沒有 sendmail.mc 文件,相應的,它提供了 /etc/mail/linux.mc ( 或者 /etc/mail/linux.nullclient.mc) 替代 sendmail.mc。/etc/mail/linux.mc 是 SuSEconfig 使用 /etc/rc.config 和 /etc/rc.config.d/sendmail.rc.config (SuSE <= 7.3) 或者 /etc/sysconfig/sendmail (SuSE >= 8.0) 的參數而生成的宏文件。SuSEconfig 執行 /sbin/conf.d/SuSEconfig.sendmail 腳本來構建 .mc 文件,並執行 m4 來生成 sendmail.cf 配置文件。用戶可以依照清單 1 所示的 SuSEconfig.sendmail 命令來生成配置文件。
結合 cron 的系統監控功能實現
系統管理人員可以結合 cron 與電子郵件的自動發送功能,實現系統狀態的自動監控功能。cron 是一個定時調度任務的守護進程,它可以根據時間、日期、月份、星期的組合來調度任務。關於 cron 的詳細教程,讀者可以參考在 developerworks 上的教程《 使用 cron 進行自動維護》,或者參考 Internet 上的相關文章。
監控系統 CPU 利用率(LINUX)
我們首先實現一個可以獲取當前系統 CPU 使用率的 Perl 腳本。它可以獲取當前的 CPU 使用率,一旦獲取到的 CPU 使用率超過 85%,該腳本就會自動發送電子郵件給指定的用戶。注意,該腳本只能運行於 Linux 平台。
具體的 Perl 腳本內容可以參考清單 19。
#!/usr/bin/perl use Mail::Mailer; sub get_cpu_stat { my @stats; my $fh; #Linux 系統,從 /proc/stat 來獲取 CPU 信息 open($fh, "cat /proc/stat |") or die "$!"; while (<$fh>) { #get the cpu stat if (/^cpu .*/) { @stats = split; } } close $fh; #then, we parse the cpu stat information; #the information from "man proc", #the format is for Linux 2.6.11 or higher #cpu user nice system idle iowait irq softirq steal #cpu 628808 1642 61861 24978051 22640 349 3086 0 0 # 數據格式如上所示,更詳細的信息請參考 proc 的 manpage my $total = $stats[1] + $stats[2] + $stats[3] + $stats[4]; my $idle = $stats[4]; # 返回當前 CPU 的 total 和 idle 時間片計數 return ($total, $idle); } my $mailer = Mail::Mailer->new('sendmail'); my ($t1, $i1) = get_cpu_stat(); sleep 5; my ($t2, $i2) = get_cpu_stat(); my $total = $t2 - $t1; my $idle = $i2 - $i1; # 計算獲取 5 秒鐘之內的 CPU 利用率 my $per = 100 * ($total - $idle) / $total; if( $per > 85) { # 如果 CPU 利用率大於 85% my $msg = sprintf("!!!Attention\nThe CPU usage on your server is %.2f" . "% right now!\nPlease check it right now!\n", $per); #send mail to the assigned user # 發送郵件給指定的用戶 $mailer->open( { From => 'root@minjun-desktop', To => '[email protected]', Subject => 'Attention for your cluster', }) or die "Mail::Mailer failed!\n"; print $mailer $msg; $mailer->close(); }
配置 cron 任務
我們可以利用“crontab”命令來配置 cron 任務;在本文中,我們設定每個小時的第 30 分鐘運行一下監控系統 CPU 利用率的腳本。我們使用”crontab – e”命令來編輯當前用戶的 cron 任務,編輯的內容如清單 20 所示,其中 mon.pl 是清單 19 中 Perl 腳本的名稱,/path/to/ 是指 mon.pl 腳本的路徑。
30 * * * * perl /path/to/mon.pl
小結
本文是 Unix/Linux 系統管理自動化系列中的一篇,主要講述 UNIX/Linux 的郵件系統的配置,並講述了如何使用 Perl 腳本來實現郵件的自動發送和接收;最後,本文把自動發送郵件的功能與 cron 系統結合在一起,給出了監控系統 CPU 利用率的腳本實現。系統管理人員可以利用類似的功能來實現系統的自動化管理,從而減輕自己的工作強度,並且提高系統的可維護性。