我有一个过程——一个 perl 脚本——它的作用是:
while true
check a POP account on a server on the lan
process any email found
write logs - messages found, actions taken, errors
sleep for 15 seconds
它运行在 redhat 7.3 服务器(我继承了它,我对这个机器的年限不满意)。它运行在 /etc/inittab 中,如下所示:
spop:2345:respawn:/usr/local/gw/bin/popdmn
如果它死机了,init 会重新启动它。
在过去的几天里,这个过程将不再起作用除非它被跟踪了。当它刚运行时,它从不登录到 pop 服务器。一旦它被跟踪(通过“strace -Ff -p cat /usr/local/gw/var/popdmn.pid
”),它就可以完美地运行。
为解决这个问题,我在服务器上运行 screen 并运行 strace。显然这不是理想的选择。
为什么进程会这样做?我以前从未见过这种情况。
答案1
我认为自己被一个古老的 strace 漏洞所困扰:
https://bugzilla.redhat.com/show_bug.cgi?id=64303
https://bugzilla.redhat.com/show_bug.cgi?id=75709
这个盒子上有 strace-4.4-4,所以听起来可能是那个错误。听起来这个是自己造成的,因为我们在尝试调试时进行了 strace 操作 - 并使情况变得更糟。
kill -CONT
努力恢复该进程。
确实是时候升级这个盒子了。
答案2
我认为最大的区别是速度和信号处理。
至于速度,如果进程是多线程的,那么 strace 将会改变时间,从而改变与竞争条件等有关的行为。或者与协议行为相关的时间信息。
示例。假设 POP 服务器已升级,现在更加谨慎地确保对等方不会一次发送多个 POP 命令。这在 SMTP 服务器中更有用,可作为垃圾邮件预防手段。
您的进程是否遵守正确的 POP 行为,即在执行每个 POP 命令后等待服务器响应?或者它是否假设成功或在命令之间等待一段时间。
如果您在通过和失败的情况下捕获实际的协议流量,是否有任何协议违规的迹象?