제3 2 일: 셸 프로 그래 밍 경고 시스템
18978 단어 linux
때 가 가장 힘 이 있다. --- 뇌봉
머리말
운영 과정: 주로 우리 의 서버 를 감시 하고 발생 하 는 고장 을 제때에 해결 하기 때문에 그 에 게 메 일 을 보 낼 수 있 거나
문자 메시지 의 경고 시스템 은 없어 서 는 안 된다.앞에서 우 리 는 자신의 메 일 서버 를 맞 춤 형 으로 만 들 었 고 제3자 도 맞 춤 형 으로 사용 한 적 이 있다.
의 모니터링 소프트웨어 는 자신의 메 일이 나 문자 경보 방법 을 실현 한다.
그러나 때때로 우 리 는 자신 만 의 경고 시스템 을 맞 추고 목적 성 이 강하 고 보장 이 있어 야 한다.
우 리 는 배 운 셸 을 사용 하여 서로 다른 수 요 를 위해 각종 개성 화 된 경고 도 구 를 맞 추고 관 리 를 통일 시 킬 수 있다.
다음은 대체적인 모델 일 뿐 구체 적 인 내용 은 우리 의 실제 업무 환경 과 우리 의 수 요 를 겨냥 해 야 한다
변경 하 는 것 이 고 우리 가 현재 가장 중요 한 것 은 그의 사고 와 체 계 를 이해 하 는 것 이다.
시스템 구조
1. 사고방식: 메 인 프로그램, 서브루틴, 프로필, 메 일 엔진, 출력 로그 등 파일 을 포함 하 는 스 크 립 트 패 키 지 를 지정 합 니 다.
주 프로그램: 전체 스 크 립 트 시스템 의 입 구 는 전체 시스템 의 명맥 입 니 다. 이 를 실행 하면 온몸 을 움 직 입 니 다.
설정 파일: 제어 센터 입 니 다. 각 서브루틴 을 끄 고 연 결 된 로그 파일 을 지정 합 니 다.
서브루틴: 각종 수요 모니터링 스 크 립 트 를 저장 하 는 것 은 시스템 의 핵심 기구 입 니 다.
메 일 엔진: phop 프로그램 으로 이 루어 집 니 다. 메 일 을 보 내 는 서버, 메 일 을 보 내 는 사람, 메 일 을 받 는 사람 을 정의 합 니 다.
출력 로그: 전체 모니터링 시스템 에 로그 출력 이 있어 야 합 니 다.
2. 시스템:
(홈 디 렉 터 리 mon)
_____________________________________|_____________________________________________
| | | | | |
bin conf shares mail log .....
| | | | | |
| | | | | |
[main.sh] [ mon.conf] [load.sh 502.sh] [mail.php mail.sh] [ mon.log err.log] [......]
bin :메 인 프로그램 이 끝나 면 그 를 임무 계획 에 넣 으 면 된다.
conf: 메 인 프로필 은 다른 응용 프로그램 과 마찬가지 로 중요 합 니 다.
mail: 메 일 엔진, php 는 주로 메 일 서버, 메 일 발송 및 수신 자, sh 를 실현 합 니 다.
log :로그, poli 시스템 로그, err 시스템 오류 로그;
shares: 각 모니터링 스 크 립 트, load 모니터링 부하, 502 모니터링 http 502 상태;
...: 당신 의 요구 에 따라 기능 을 만 드 는 디 렉 터 리 를 추가 하고 모니터링 서비스 만 추가 하면 shares 에 가입 하면 됩 니 다.
3: 시스템 스 크 립 트 템 플 릿
수요: 서버 부하 와 사이트 에 발생 하 는 502 오 류 를 감시 하고 제 qq 메 일 로 메 일 을 보 냅 니 다.
1. main.sh
#!/bin/bash
# ,copy by aming;
export send=1 # ,1 ;export ,
export addr=`/sbin/ifconfig |grep -A1 'eth0' |grep addr: |awk '{print $2}'|awk -F: '{print $2}'` # ip , ,
dir=`pwd`
last_dir=`echo $dir|awk -F'/' '{print $NF}'` # ,
# : , bin , 、
if [ $last_dir == "bin" ] || [ $last_dir == "bin/" ]; then
conf_file="../conf/mon.conf" # ,
else
echo "you shoud cd bin dir" # ,
exit
fi
exec 1>>../log/mon.log 2>>../log/err.log # , log
echo "`date +"%F %T"` load average" # ,
/bin/bash ../shares/load.sh #
# 502
if grep -q 'to_mon_502=1' $conf_file; then
export log=`grep 'logfile=' $conf_file |awk -F '=' '{print $2}' |sed 's/ //g'`
/bin/bash ../shares/502.sh # , 502
fi
2. mon.conf
## to config the options if to monitor
## cdb mysql 、 user、password
to_mon_cdb=0 ##0 or 1, default 0,0 not monitor, 1 monitor
cdb_ip=10.20.3.13 ## IP
cdb_port=3315
cdb_user=username
cdb_pass=passwd
to_mon_httpd=0 ## httpd 1 , 0
to_mon_php_socket=0 ## php 1 , 0
to_mon_502=1 ## http_code_502
logfile=/data/log/xxx.xxx.com/access.log
## request_count
to_mon_request_count=0 ##
req_log=/data/log/ ## discuz , log
domainname= ##
3. load.sh
#! /bin/bash
## ##
---------------------------------------- --------------------------------------
load=`uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1`
## w avreage
if [ $load -gt 20 ] && [ $send -eq "1" ] ## load ,send
then
echo "$addr `date +%T` load is $load" >../log/load.tmp ## load.tmp
/bin/bash ../mail/mail.sh $addr\_load $load ../log/load.tmp
fi ## , $1 $2 $3
echo "`date +%T` load is $load" ## ,
4. 502.sh
#! /bin/bash
## ##
d=`date -d "-1 min" +%H:%M` ## d
c_502=`grep :$d: $log |grep ' 502 '|wc -l`
if [ $c_502 -gt 10 ] && [ $send == 1 ]; then ## 502 , send
echo "$addr $d 502 count is $c_502">../log/502.tmp ## 502.tmp
/bin/bash ../mail/mail.sh $addr\_502 $c_502 ../log/502.tmp
fi ## , $1 $2 $3
echo "`date +%T` 502 $c_502" ## 502 ,
추가: disk. sh
#! /bin/bash
##Writen by aming##
--------------------------------- --------------------------------------
rm -f ../log/disk.tmp ## disk
for r in `df -h |awk -F '[ %]+' '{print $5}'|grep -v Use` #
do
if [ $r -gt 90 ] && [ $send -eq "1" ] ## r
then
echo "$addr `date +%T` disk useage is $r" >>../log/disk.tmp # disk.tmp
fi
if [ -f ../log/disk.tmp ] # , 90
then
df -h >> ../log/disk.tmp #
/bin/bash ../mail/mail.sh $addr\_disk $r ../log/disk.tmp
echo "`date +%T` disk useage is nook" ## ,
else
echo "`date +%T` disk useage is ok" ## , ok
fi
5. mail. php: 사실 많은 내용 이 우리 에 게 쓸모 가 없습니다. php 를 잘 모 르 기 때문에 잘못 삭제 한 후에 필요 한 내용 을 초래 할 까 봐 걱정 입 니 다.
문제 가 생기 면 그대로 복사 하고 맨 밑 에 소개 하 는 내용 을 주로 사용 합 니 다.
<?php
class Smtp
{
/* Public Variables */
var $smtp_port;
var $time_out;
var $host_name;
var $log_file;
var $relay_host;
var $debug;
var $auth;
var $user;
var $pass;
/* Private Variables */
var $sock;
/* Constractor */
function Smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
{
$this->debug = FALSE;
$this->smtp_port = $smtp_port;
$this->relay_host = $relay_host;
$this->time_out = 30; //is used in fsockopen()
#
$this->auth = $auth;//auth
$this->user = $user;
$this->pass = $pass;
#
$this->host_name = "localhost"; //is used in HELO command
$this->log_file = "";
$this->sock = FALSE;
}
/* Main Function */
function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
{
$mail_from = $this->get_address($this->strip_comment($from));
$body = ereg_replace("(^|(\r
))(\.)", "\1.\3", $body);
$header = "MIME-Version:1.0\r
";
if($mailtype=="HTML"){
$header .= "Content-Type:text/html\r
";
}
$header .= "To: ".$to."\r
";
if ($cc != "") {
$header .= "Cc: ".$cc."\r
";
}
$header .= "From: $from<".$from.">\r
";
$header .= "Subject: ".$subject."\r
";
$header .= $additional_headers;
$header .= "Date: ".date("r")."\r
";
$header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r
";
list($msec, $sec) = explode(" ", microtime());
$header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r
";
$TO = explode(",", $this->strip_comment($to));
if ($cc != "") {
$TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
}
if ($bcc != "") {
$TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
}
$sent = TRUE;
foreach ($TO as $rcpt_to) {
$rcpt_to = $this->get_address($rcpt_to);
if (!$this->smtp_sockopen($rcpt_to)) {
$this->log_write("Error: Cannot send email to ".$rcpt_to."
");
$sent = FALSE;
continue;
}
if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
$this->log_write("E-mail has been sent to <".$rcpt_to.">
");
} else {
$this->log_write("Error: Cannot send email to <".$rcpt_to.">
");
$sent = FALSE;
}
fclose($this->sock);
$this->log_write("Disconnected from remote host
");
}
return $sent;
}
/* Private Functions */
function smtp_send($helo, $from, $to, $header, $body = "")
{
if (!$this->smtp_putcmd("HELO", $helo)) {
return $this->smtp_error("sending HELO command");
}
#auth
if($this->auth){
if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
return $this->smtp_error("sending HELO command");
}
if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
return $this->smtp_error("sending HELO command");
}
}
#
if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {
return $this->smtp_error("sending MAIL FROM command");
}
if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {
return $this->smtp_error("sending RCPT TO command");
}
if (!$this->smtp_putcmd("DATA")) {
return $this->smtp_error("sending DATA command");
}
if (!$this->smtp_message($header, $body)) {
return $this->smtp_error("sending message");
}
if (!$this->smtp_eom()) {
return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
}
if (!$this->smtp_putcmd("QUIT")) {
return $this->smtp_error("sending QUIT command");
}
return TRUE;
}
function smtp_sockopen($address)
{
if ($this->relay_host == "") {
return $this->smtp_sockopen_mx($address);
} else {
return $this->smtp_sockopen_relay();
}
}
function smtp_sockopen_relay()
{
$this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."
");
$this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."
");
$this->log_write("Error: ".$errstr." (".$errno.")
");
return FALSE;
}
$this->log_write("Connected to relay host ".$this->relay_host."
");
return TRUE;
}
function smtp_sockopen_mx($address)
{
$domain = ereg_replace("^.+@([^@]+)$", "\1", $address);
if (!@getmxrr($domain, $MXHOSTS)) {
$this->log_write("Error: Cannot resolve MX \"".$domain."\"
");
return FALSE;
}
foreach ($MXHOSTS as $host) {
$this->log_write("Trying to ".$host.":".$this->smtp_port."
");
$this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write("Warning: Cannot connect to mx host ".$host."
");
$this->log_write("Error: ".$errstr." (".$errno.")
");
continue;
}
$this->log_write("Connected to mx host ".$host."
");
return TRUE;
}
$this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")
");
return FALSE;
}
function smtp_message($header, $body)
{
fputs($this->sock, $header."\r
".$body);
$this->smtp_debug("> ".str_replace("\r
", "
"."> ", $header."
> ".$body."
> "));
return TRUE;
}
function smtp_eom()
{
fputs($this->sock, "\r
.\r
");
$this->smtp_debug(". [EOM]
");
return $this->smtp_ok();
}
function smtp_ok()
{
$response = str_replace("\r
", "", fgets($this->sock, 512));
$this->smtp_debug($response."
");
if (!ereg("^[23]", $response)) {
fputs($this->sock, "QUIT\r
");
fgets($this->sock, 512);
$this->log_write("Error: Remote host returned \"".$response."\"
");
return FALSE;
}
return TRUE;
}
function smtp_putcmd($cmd, $arg = "")
{
if ($arg != "") {
if($cmd=="") $cmd = $arg;
else $cmd = $cmd." ".$arg;
}
fputs($this->sock, $cmd."\r
");
$this->smtp_debug("> ".$cmd."
");
return $this->smtp_ok();
}
function smtp_error($string)
{
$this->log_write("Error: Error occurred while ".$string.".
");
return FALSE;
}
function log_write($message)
{
$this->smtp_debug($message);
if ($this->log_file == "") {
return TRUE;
}
$message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
$this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"
");
return FALSE;;
}
flock($fp, LOCK_EX);
fputs($fp, $message);
fclose($fp);
return TRUE;
}
function strip_comment($address)
{
$comment = "\([^()]*\)";
while (ereg($comment, $address)) {
$address = ereg_replace($comment, "", $address);
}
return $address;
}
function get_address($address)
{
$address = ereg_replace("([ \t\r
])+", "", $address);
$address = ereg_replace("^.*<(.+)>.*$", "\1", $address);
return $address;
}
function smtp_debug($message)
{
if ($this->debug) {
echo $message;
}
}
}
$file = $argv[2];
$smtpserver = "smtp.qq.com"; //SMTP , qq ,
$smtpserverport = "25"; //SMTP
$smtpusermail = "[email protected]"; //SMTP ,
$smtpemailto = "[email protected]"; //
$smtpuser = "1193443"; //SMTP
$smtppass = "1212lss"; //SMTP , SMTP
$mailsubject = $argv[1]; //
$mailbody = file_get_contents($file); //
$mailtype = "HTML"; // (HTML/TXT),TXT
$smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);
// true , .
//$smtp->debug = TRUE; //
$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);
?>
메 일 을 보 내 려 면 먼저 phop 지원 이 있어 야 합 니 다. lamp 이나 lnmp 를 설치 하지 않 았 다 면 yum install 을 실행 해 야 합 니 다. php 설치;
그리고 실행 방법: php mail.php "메 일 테마""/tmp/test. txt" ;
그 중에서/tmp/test. txt 내용 은 메 일 내용 입 니 다.
메 일 테마: 아래 파일 을 가리 키 는 php $1 $2
메 일 내용: 아래 파일 을 가리 키 는 php $3
qq 메 일 서비스 열기: 발송 자로 정의 할 qq 메 일 에 들 어가 서 설정 에서 서 비 스 를 찾 은 다음 모두 엽 니 다. 가장 중요 한 것 은 SMTP 입 니 다.
그리고 당신 의 독립 비밀 번 호 를 설정 하면 OK 입 니 다.
6.mail.sh
log=$1 #$1 $addr\_502 $addr\_load
t_s=`date +%s` #
t_s2=`date -d "2 hours ago" +%s` #
if [ ! -f /tmp/$log ] # $log
then
echo $t_s2 > /tmp/$log # $log, $[$addr\_502]
fi
t_s2=`tail -1 /tmp/$log|awk '{print $1}'` #
echo $t_s>>/tmp/$log # $log
v=$[$t_s-$t_s2] # ,
echo $v #
if [ $v -gt 3600 ] # 3600
then
/dir/to/php ../mail/mail.php "$1 $2" "$3" # $123 php
echo "0" > /tmp/$log.txt ## ,
else
if [ ! -f /tmp/$log.txt ] #
then
echo "0" > /tmp/$log.txt # , 0
fi
nu=`cat /tmp/$log.txt` # , , 0
nu2=$[$nu+1] # 1
echo $nu2>/tmp/$log.txt #
if [ $nu2 -gt 10 ] # 10
then
/dir/to/php ../mail/mail.php "trouble continue 10 min $1 $2 " "$3"
echo "0" > /tmp/$log.txt ## php
fi ## ; 10 ,
fi # 9 , ,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.