如何记录 exim pipe 命令的完整输出

如何记录 exim pipe 命令的完整输出

我需要调试在 exim 传输管道命令中使用的 python 脚本。我已经尝试过了log_output,但它只记录了 python 脚本返回的输出的第一行,这是一个traceback错误。

my_transport:
driver = pipe
command = /usr/bin/python /path/to/myscript.py
log_fail_output
group = mail
user = mail

我想查看完整的引用错误以便mainlog进行调试。怎么做?

答案1

您可以尝试返回输出指示

return_output(管道)

类型:布尔值 默认值:false

如果此选项为真,并且命令生成了任何输出,则无论命令的返回代码是什么,都视为传递失败,并且输出将返回到传递错误消息中。否则,输出将被丢弃。但是,如果消息的发送者为空(即,它是传递错误消息),则无论此选项的设置如何,命令的输出始终会被丢弃。

答案2

要添加到@user9517的答案return_output 指令,我想分享一下如何在基于 RedHat 的 cPanel 服务器上看到 Exim 日志输出:

  1. 关闭 Exim 的任何监控或服务重启。例如,cPanel 服务器有一个“服务管理器”,它可以停止会干扰您调试运行的重启,并在您需要时在后续步骤中正常停止服务。
  2. 检查 Exim 的正常运行情况:
ps aux | grep "exi[m]"
  1. 杀死 Exim,你的命令可能与我的不同。(-9 很危险,要知道你在做什么)
kill -9 $( ps aux | grep "sbin\/exi[m]" )
  1. 使用 以调试模式启动 Exim -d,并将输出保存到文件以及 STDIN(如果需要),您的命令可能与我的不同。 +全部据我所知,尽可能多地添加。
/usr/sbin/exim -d+all -ps -bd -q15m -oP /var/spool/exim/exim-daemon.pid 2&1 | tee ~/exim-debug.log
  1. 查看 Exim 的路由。这只是一行方便的命令,仅显示已采取的成功路由。
cat ~/exim-debug.log | perl -0076 -ne '@x = $_ =~ /(^ ([^ ]*) .+? routed by \2 )/gs; $"="\n==========\n\n"; $cnt=0; for (@x){ print " -------->$_\n\n" unless $cnt % 2; $cnt++}'

完整日志中提到了子进程。

grep -A15 'direct command' ~/exim-debug.log

Exim 主日志也显示结果:

/var/log/exim_mainlog

答案3

我设法使用该use_shell选项记录了完整的输出。由于它传递了整个命令/bin/sh,因此可以使用 shell 重定向和管道。请注意,文档认为此方法不太安全。

您的交通方式将变为:

my_transport:
driver = pipe
command = /usr/bin/python /path/to/myscript.py 2>/tmp/debug_stderr.txt >/tmp/debug_stdout.txt
log_fail_output
group = mail
user = mail
use_shell = true

查看文档这里

相关内容