我需要调试在 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 日志输出:
- 关闭 Exim 的任何监控或服务重启。例如,cPanel 服务器有一个“服务管理器”,它可以停止会干扰您调试运行的重启,并在您需要时在后续步骤中正常停止服务。
- 检查 Exim 的正常运行情况:
ps aux | grep "exi[m]"
- 杀死 Exim,你的命令可能与我的不同。(-9 很危险,要知道你在做什么)
kill -9 $( ps aux | grep "sbin\/exi[m]" )
- 使用 以调试模式启动 Exim
-d
,并将输出保存到文件以及 STDIN(如果需要),您的命令可能与我的不同。 +全部据我所知,尽可能多地添加。
/usr/sbin/exim -d+all -ps -bd -q15m -oP /var/spool/exim/exim-daemon.pid 2&1 | tee ~/exim-debug.log
- 查看 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
查看文档这里。