作为守护进程分离时,文件访问时asyncore出现异常

2024-05-18 06:59:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经使用python2.7中的asynchat和邮箱模块编写了一个电子邮件服务器。当运行在前轮一切工作正常,是稳定的长期测试。但是,当作为守护进程分离时,对邮箱的访问会导致中出现异常异步内核.loop()表示错误的文件描述符。只有文件访问是个问题。套接字I/O继续正常工作。你知道吗

文件是在__init__()中打开还是稍后在found\u terminator()函数中打开似乎无关紧要。你知道吗

我使用Schroeder的ActiveState配方278731中的代码分离进程,但是使用单独的守护程序模块并不能改变症状。你知道吗

下面是一段伪代码来显示流程:

createDaemon()
s = myServer() # subclass of asynchat.async_chat
dropPermissions #setuid nobody
asyncore.loop()

以下是爆炸时的strace输出:

open("/tmp/MailboxDir/cur/1462562219.M374224P24795Q1.i7", O_RDONLY|O_LARGEFILE) = 8
fstat64(8, {st_mode=S_IFREG|0644, st_size=36, ...}) = 0
...
...
read(8, "To: you\nFrom: me\nSubject: test\n\n"..., 8192) = 36
read(8, "", 4096)                       = 0
read(8, "", 8192)                       = 0
close(8)                                = 0
...
stat64("/tmp/MailboxDir/cur/1462562219.M374224P24795Q1.i7", {st_mode=S_IFREG|0644, st_size=36, ...}) = 0
send(7, "+OK POP3 server ready\r\n", 23, 0) = 23
select(8, [4 5 6 7], [], [4 5 6 7], {30, 0}) = -1 EBADF (Bad file descriptor)

省略的部分包括加载分析器.py以及饲料分析器.py使用mmap2打开和关闭几个文件描述符的模块。你知道吗

因此,电子邮件文件的fd关闭,但不久之后,fd显示在select列表中。我不清楚fd是如何添加到asyncore通道映射的,也不清楚为什么它在close()之后仍然存在。我不清楚哪个fd现在是无效的。也不清楚为什么在shell进程中运行时不会发生这种情况。你知道吗

如果我使用线程,我可以看到这种情况发生,但是我快速查看了导入的模块,没有看到任何指示它们启动单独的线程或进程的内容。而且,如果我继续以root用户身份运行而不是以nobody用户身份运行,行为也不会改变。你知道吗

asyncore和邮箱模块肯定在其他守护进程中使用。我觉得我一定错过了什么明显的东西。你知道吗


Tags: 模块文件代码loopread进程电子邮件tmp
1条回答
网友
1楼 · 发布于 2024-05-18 06:59:37

结果发现,不管是否拥有,邮件包都在关闭文件描述符4。在我的例子中,fd4总是被分配给日志文件。我打开了一个被分配了fd4的文本文件,并将日志文件推送到fd5来进行验证。文本文件fd在处理从邮箱读取的第一封电子邮件时关闭。你知道吗

试着调试邮件包占用了太多的时间,所以我写了一个足以满足我需要的替代品,继续我的工作。你知道吗

相关问题 更多 >