我想使用 bash 脚本(Python 是第二好的)来定期(每小时)监控我的邮件服务器是否在线并运行。
我知道有针对此任务的专用解决方案(Nagios,...),但我确实需要一些简单的东西,可以将其用作 cronjob。只能看到邮件服务器还活着。
我知道如何通过 telnet 与邮件服务器通信,即:
telnet mail.foo.org 25
EHLO example.com
mail from:
rcpt to:
...
但这是互动的。是否可以使用脚本检查邮件服务器正在通信?显然,我不想全程发送电子邮件。我只是想测试邮件服务器是否正在响应。
答案1
您可以nc
像这样测试 SMTP 邮件服务器:
$ nc -w 5 mail.mydom.com 25 << EOF
HELO mail.mydom.com
QUIT
EOF
笔记:该选项-w 5
指示nc
最多等待 5 秒。要监视的服务器就是mail.mydom.com
我们25
要连接的端口。
如果您发现您的服务器存在以下问题,您也可以使用上述形式HELO
:
$ echo "QUIT" | nc -w 5 mail.mydom.com 25
笔记:此表单适用于 Postfix 和 Sendmail!
例子
我正在连接到我的邮件服务器。
$ echo "QUIT" | nc -w 5 mail.bubba.net 25
220 bubba.net ESMTP Sendmail 8.14.3/8.14.3; Sat, 19 Apr 2014 16:31:44 -0400
221 2.0.0 bubba.net closing connection
$
如果检查此操作返回的状态:
$ echo $?
0
但是,如果另一端没有任何内容接受我们的连接:
$ echo QUIT | nc -w5 localhost 25
Ncat: Connection refused.
$
检查由此返回的状态:
$ echo $?
1
把它放在一起
这是我的脚本版本,名为mail_chkr.bash
.
#!/bin/bash
echo "Checking Mail Server #1"
echo "QUIT" | nc -w 5 mail.bubba.net 25 > /dev/null 2>&1
if [ $? == 0 ]; then
echo "mail server #1 is UP"
else
echo "mail server #1 is DOWN"
fi
echo "Checking Mail Server #2"
echo "QUIT" | nc -w 5 localhost 25 > /dev/null 2>&1
if [ $? == 0 ]; then
echo "mail server #2 is UP"
else
echo "mail server #2 is DOWN"
fi
运行它:
$ ./mail_chkr.bash
Checking Mail Server #1
mail server #1 is UP
Checking Mail Server #2
Ncat: Connection refused.
mail server #2 is DOWN