跳至内容

使用 `postfix` 进行进程报告

先决条件

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

简介

许多 Rocky Linux 服务器管理员会编写脚本来执行特定任务,例如备份或文件同步,其中许多脚本会生成包含有用甚至非常重要的信息的日志。然而,仅仅拥有日志是不够的。如果一个进程失败并记录了该失败,但繁忙的管理员没有查看日志,那么一场灾难可能正在酝酿之中。

本文档将向您展示如何使用 postfix MTA(邮件传输代理)从特定进程抓取日志详细信息,并通过电子邮件发送给您。它还涉及日志中的日期格式,并帮助您确定在报告过程中需要使用的格式。

请记住,这只是关于您可以通过 postfix 进行报告的冰山一角。请注意,限制运行的进程只包括您一直需要的那些,这始终是一个好的安全举措。

本文档将向您展示如何仅为需要它执行的报告启用 postfix,然后再次将其关闭。

postfix 定义

postfix 是一个用于发送电子邮件的服务器守护进程。它比 sendmail 更安全、更简单,sendmail 是多年来默认的首选 MTA。您可以将其用作功能齐全的邮件服务器的一部分。

安装 postfix

除了 postfix,您还需要 s-nail 来测试您发送电子邮件的能力。要安装这些以及任何必需的依赖项,请在 Rocky Linux 服务器命令行上输入以下命令:

dnf install postfix s-nail

测试和配置 postfix

先测试邮件

在配置 postfix 之前,您需要了解邮件离开服务器时会是什么样子,因为您可能会想更改它。为此,请启动 postfix

systemctl start postfix

使用 s-nail 提供的 mail 命令进行测试。

mail -s "Testing from server" myname@mydomain.com

这将显示一个空白行。在此处键入您的测试消息。

testing from the server

Enter,然后输入单个 .

系统将显示以下内容:

EOT

这样做的目的是查看您的邮件在外部世界看来是什么样子。您可以通过启动 postfix 时激活的 maillog 来了解这一点。

使用此命令查看日志文件的输出:

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

保存更改并退出文件。

在继续编辑通用文件之前,您需要查看电子邮件的外观。具体来说,您需要创建您之前在 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 page 或在命令行键入 man date 来打开 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