使用 postfix
进行服务器进程报告¶
先决条件¶
- 对在 Rocky Linux 服务器上从命令行操作感到十分舒适
- 熟悉您选择的编辑器(本文档使用
vi
编辑器,但您可以替换您喜欢的编辑器) - 了解 DNS(域名系统)和主机名
- 能够在 bash 脚本中分配变量
- 了解
tail
、more
、grep
和date
命令的作用
简介¶
许多 Rocky Linux 服务器管理员编写脚本以执行特定任务,例如备份或文件同步,而这些脚本中的许多都生成包含有用信息(有时非常重要)的日志。但是,仅仅拥有日志是不够的。如果一个进程失败并记录了失败,但忙碌的管理员没有查看日志,那么就可能发生灾难。
本文档将向您展示如何使用 postfix
MTA(邮件传输代理)从特定进程获取日志详细信息,并通过电子邮件将它们发送给您。它还涉及到日志中的日期格式,并帮助您确定在报告过程中需要使用哪种格式。
请记住,这只是您使用 postfix
进行报告可以做的事情的冰山一角。请注意,限制正在运行的进程(仅限于您一直需要使用的进程)始终是一个良好的安全措施。
本文档将向您展示如何仅为所需的报告启用 postfix,然后再次将其关闭。
postfix
定义¶
postfix
是一个用于发送电子邮件的服务器守护进程。它比 sendmail 更安全更简单,sendmail 是另一个多年来一直是默认的首选 MTA 的 MTA。您可以将其用作完整功能的邮件服务器的一部分。
安装 postfix
¶
除了 postfix
之外,您还需要 mailx
来测试您发送电子邮件的能力。要安装这些以及任何所需的依赖项,请在 Rocky Linux 服务器命令行中输入以下内容
dnf install postfix mailx
Rocky Linux 9.0 的变更
此过程在 Rocky Linux 9.0 中运行良好。这里不同之处在于 mailx
命令的来源。虽然您可以在 8.x 中按名称安装它,但在 9.0 中,mailx
来自 appstream 包 s-nail
。要安装所需的软件包,您需要使用
dnf install postfix s-nail
测试和配置 postfix
¶
首先测试邮件¶
在配置 postfix
之前,您需要找出邮件离开服务器时的外观,因为您可能需要更改它。为此,请启动 postfix
systemctl start postfix
使用 mailx
(或 s-nail
)提供的 mail
进行测试
mail -s "Testing from server" myname@mydomain.com
这将显示一个空白行。在此处键入您的测试消息
testing from the server
按回车键,然后输入一个句点
.
系统将以以下方式响应
EOT
执行此操作的目的是查看我们的邮件在外部世界中的外观。您可以从 maillog 中了解到这一点,maillog 会随着 postfix
的启动而变为活动状态。
使用以下命令查看日志文件的输出
tail /var/log/maillog
您将看到类似以下内容,尽管日志文件将具有电子邮件地址的不同域名和其他项目
Mar 4 16:51:40 hedgehogct postfix/postfix-script[735]: starting the Postfix mail system
Mar 4 16:51:40 hedgehogct postfix/master[737]: daemon started -- version 3.3.1, configuration /etc/postfix
Mar 4 16:52:04 hedgehogct postfix/pickup[738]: C9D42EC0ADD: uid=0 from=<root>
Mar 4 16:52:04 hedgehogct postfix/cleanup[743]: C9D42EC0ADD: message-id=<20210304165204.C9D42EC0ADD@somehost.localdomain>
Mar 4 16:52:04 hedgehogct postfix/qmgr[739]: C9D42EC0ADD: from=<root@somehost.localdomain>, size=457, nrcpt=1 (queue active)
Mar 4 16:52:05 hedgehogct postfix/smtp[745]: connect to gmail-smtp-in.l.google.com[2607:f8b0:4001:c03::1a]:25: Network is unreachable
Mar 4 16:52:06 hedgehogct postfix/smtp[745]: C9D42EC0ADD: to=<myname@mydomain.com>, relay=gmail-smtp-in.l.google.com[172.217.212.26]
:25, delay=1.4, delays=0.02/0.02/0.99/0.32, dsn=2.0.0, status=sent (250 2.0.0 OK 1614876726 z8si17418573ilq.142 - gsmtp)
Mar 4 16:52:06 hedgehogct postfix/qmgr[739]: C9D42EC0ADD: removed
"somehost.localdomain" 表明您需要进行一些更改。首先停止 postfix
守护进程
systemctl stop postfix
配置 postfix
¶
由于您没有设置完整的、功能齐全的邮件服务器,因此您将使用的配置选项并不那么广泛。首先要做的是修改 main.cf 文件(实际上是 postfix
的主要配置文件)。首先进行备份
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
编辑它
vi /etc/postfix/main.cf
在我们的示例中,我们的服务器名称是“bruno”,我们的域名是“ourdomain.com”。在文件中找到以下行
#myhostname = host.domain.tld
您可以删除注释(#)或在此行下添加一行。根据我们的示例,该行将显示为
myhostname = bruno.ourdomain.com
接下来,找到域名行
#mydomain = domain.tld
同样,删除注释并更改它,或在它下面添加一行
mydomain = ourdomain.com
最后,转到文件末尾并添加以下行
smtp_generic_maps = hash:/etc/postfix/generic
保存您的更改(在 vi
中为 Shift : wq!
)并退出文件。
在继续编辑通用文件之前,您需要查看电子邮件的外观。具体来说,您需要创建上面在 main.cf 文件中引用的“generic”文件
vi /etc/postfix/generic
此文件告诉 postfix
来自此服务器的任何电子邮件的外观。还记得我们的测试电子邮件和日志文件吗?这就是我们修复所有这些问题的地方
root@somehost.localdomain root@bruno.ourdomain.com
@somehost.localdomain root@bruno.ourdomain.com
接下来,您需要告诉 postfix
使用所有更改。使用 postmap 命令执行此操作
postmap /etc/postfix/generic
启动 postfix
并使用上面相同的步骤再次测试您的电子邮件。您现在会发现所有“localdomain”实例现在都是实际域名。
date
命令和名为 today 的变量¶
并非所有应用程序都使用相同的日志记录格式来记录日期。您可能需要对为报告编写的任何脚本进行创造性的处理,以按日期进行报告。
假设您想查看您的系统日志,并提取与今天的日期相关的 dbus-daemon 的所有内容,并将它们发送给自己。(这可能不是最好的示例,但它会让您了解如何执行此操作。)
您需要在脚本中使用一个变量。将其命名为“today”。您希望它与“date”命令的输出相关联,并以特定格式进行格式化,以便您可以从我们的系统日志(位于/var/log/messages中)获取所需的数据。首先,进行一些调查工作。
首先,在命令行中输入date命令
date
这将为您提供默认的系统日期输出,它可能类似于以下内容
Thu Mar 4 18:52:28 UTC 2021
检查我们的系统日志,看看它是如何记录信息的。为此,请使用more
和grep
命令
more /var/log/messages | grep dbus-daemon
这将为您提供类似以下内容
Mar 4 18:23:53 hedgehogct dbus-daemon[60]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Mar 4 18:50:41 hedgehogct dbus-daemon[60]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.1' (uid=0 pid=61 comm="/usr/sbin/NetworkManager --no-daemon " label="unconfined")
Mar 4 18:50:41 hedgehogct dbus-daemon[60]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher
日期和日志输出需要在我们的脚本中完全相同。让我们看看如何使用名为“today”的变量来格式化日期。
检查您需要对日期进行哪些操作才能获得与系统日志相同的输出。您可以参考Linux 手册页或在命令行中键入man date
以调出日期手册页以获取所需的信息。
您会发现要以与/var/log/messages相同的方式格式化日期,您需要使用%b和%e格式字符串,其中%b是 3 个字符的月份,%e 是空格填充的日期。
脚本¶
对于我们的 bash 脚本,您可以看到您将使用date
命令和一个名为“today”的变量。(请记住,“today”是任意的。您可以将此变量命名为任何您喜欢的名称)。在本例中,您将调用您的脚本test.sh
并将其放置在/usr/local/sbin中
vi /usr/local/sbin/test.sh
在开头,请注意,即使我们文件中的注释说您正在将这些消息发送到电子邮件,但现在,您只是将它们发送到标准日志输出以验证它们是否正确。
此外,在我们的第一个脚本运行中,您正在获取当前日期的所有消息,而不仅仅是 dbus-daemon 消息。您很快就会处理这个问题。
请注意,grep
命令将在输出中返回文件名,在这种情况下,您不希望这样做。要删除它,请向 grep 添加“-h”选项。此外,当您设置变量“today”时,您需要查找整个变量作为一个字符串,这需要将字符串放在引号中
#!/bin/bash
# set the date string to match /var/log/messages
today=`date +"%b %e"`
# grab the dbus-daemon messages and send them to email
grep -h "$today" /var/log/messages
现在就这些。保存您的更改并使脚本可执行
chmod +x /usr/local/sbin/test.sh
测试它
/usr/local/sbin/test.sh
如果一切正常,您将获得/var/log/messages中今天的所有消息的长列表,包括但不限于 dbus-daemon 消息。下一步是将消息限制为 dbus-daemon 消息。再次更改您的脚本
vi /usr/local/sbin/test.sh
#!/bin/bash
# set the date string to match /var/log/messages
today=`date +"%b %e"`
# grab the dbus-daemon messages and send them to email
grep -h "$today" /var/log/messages | grep dbus-daemon
再次运行脚本,将只获取 dbus-daemon 消息,并且只获取今天发生的那些消息。
还有一步需要完成。请记住,您需要将其通过电子邮件发送给管理员以供审查。由于您只在这台服务器上使用postfix
进行报告,因此您不希望让服务保持运行。在脚本开始时启动它,并在结束时停止它。在这里,sleep
命令暂停 20 秒,确保在关闭postfix
之前发送电子邮件。此最终编辑添加了刚刚讨论的停止、启动和休眠问题,并将内容通过管道发送到管理员的电子邮件。
vi /usr/local/sbin/test.sh
更改脚本
#!/bin/bash
# start postfix
/usr/bin/systemctl start postfix
# set the date string to match /var/log/messages
today=`date +"%b %e"`
# grab the dbus-daemon messages and send them to email
grep -h "$today" /var/log/messages | grep dbus-daemon | mail -s "dbus-daemon messages for today" myname@mydomain.com
# make sure the email has finished before continuing
sleep 20
# stop postfix
/usr/bin/systemctl stop postfix
再次运行脚本,您现在将收到来自服务器的包含 dbus-daemon 消息的电子邮件。
您现在可以使用crontab来安排它在特定时间运行。
结论¶
使用postfix
可以帮助您跟踪您希望监控的进程日志。您可以将它与 bash 脚本一起使用,以牢牢掌握您的系统进程,并在出现问题时获得通知。
作者:Steven Spencer
贡献者:Ezequiel Bruni,Ganna Zhyrnova