跳至内容

使用 postfix 进行服务器进程报告

先决条件

  • 对在 Rocky Linux 服务器上从命令行操作感到十分舒适
  • 熟悉您选择的编辑器(本文档使用 vi 编辑器,但您可以替换您喜欢的编辑器)
  • 了解 DNS(域名系统)和主机名
  • 能够在 bash 脚本中分配变量
  • 了解 tailmoregrepdate 命令的作用

简介

许多 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

检查我们的系统日志,看看它是如何记录信息的。为此,请使用moregrep命令

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