我有一个过程 - 一个 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 会重新启动它。
在过去的几天里,该过程将不再起作用,除非它被跟踪。当它刚刚运行时,它永远不会登录到弹出服务器。一旦它被跟踪(通过“strace -Ff -p cat /usr/local/gw/var/popdmn.pid
”),它就可以完美地工作。
作为一种解决方法,我正在运行 strace 的服务器上运行屏幕。显然,这不太理想。
为什么进程会这样做?我以前从未见过这种情况。
我想我被一个古老的 strace 虫子咬了:
https://bugzilla.redhat.com/show_bug.cgi?id=64303
https://bugzilla.redhat.com/show_bug.cgi?id=75709
这个盒子上有 strace-4.4-4,所以听起来可能就是那个错误。这听起来像是自己造成的,因为我们在尝试调试时一直在跟踪 - 并且使情况变得更糟。
kill -CONT
努力恢复该过程。绝对是时候升级这个盒子了。
我想最大的区别是速度和信号处理。
关于速度,如果进程是多线程的,那么 strace 将改变时间,这会改变我在竞争条件等方面的行为或与协议行为相关的时间信息。
例子。假设 POP 服务器已经升级,现在更加小心地确保对等方没有同时发送多个 POP 命令。这在 SMTP 服务器中作为一种垃圾邮件预防手段更为有用。
您的进程是否观察到正确的 POP 行为,因为它在每个 POP 命令之后等待来自服务器的响应?还是假设成功或在命令之间等待一段时间。
如果您在通过和失败的情况下捕获实际的协议流量,是否有任何违反协议的迹象?