1

我实现了一个心跳机制,其中应用程序“app1”每 60 秒向看门狗进程“watch1”发送一次脉冲。如果 watch1 在 60 秒后没有从 app1 收到任何消息,则假定 app1 已死并重新启动它。但实际上它是活的。这种通信通过 TCP/IP 套接字和在同一台机器上运行的应用程序发生。watch1 进程侦听端口 3000 以从 app1 读取数据包。这些应用程序在多个操作系统 UNIX、AIX 等上运行。

但是对于特定的 AIX 机器,“app1”的套接字正在关闭,并且 watch1 进程一次又一次地重新启动 app1。它的多线程应用程序 app1 创建一个线程以将消息/数据包发送到 watch1。

我放置了一个脚本,它每 60 秒在 app1 PID 上运行“procstack”以查看发生了什么。这并没有提供我希望的任何指针(比如被卡在锁上),而是开始显示一些“奇怪”的堆栈模式:

 ---------- tid# 21692655 (pthread ID:   3342) ----------
 0xd4be4754  SocketBase::close()(0x0) + 0x34 
 0xd0503ca4  _event_wait(??, ??) + 0x2c4
 0xd0511e78  _cond_wait_local(??, ??, ??) + 0x378
 0xd05125d0  _cond_wait(??, ??, ??) + 0xb0
 0xd0512f1c  pthread_cond_timedwait(??, ??, ??) + 0x21c
 0xd4a2cbd8  TaskEvent::Wait(int)(0x32ebc03c, 0x7530) + 0xd8
 0xd4e40b70  SendIAmAliveThreadFunc(void*)(0x32ebc038) + 0xf50
 0xd3dfcdc4  ThreadStartRoutine(void*)(0x32ebbba8) + 0xc4
 0xd04f0c4c  _pthread_body(??) + 0xec 

内核服务 _event_wait() 将调用我们的代码(用于套接字处理的包装类)SocketBase::close() 是没有意义的。可能是一些奇怪的异常;可能需要一些 AIX 专业知识来帮助诊断。

有人知道这个问题或对此有指导吗?

** * ** * * EDIT1 - 23-11-12 * ***

app1 进程以信号 15 终止。

日志:在线程 515 上收到信号 15 线程 515 未处理信号 15 由于信号 15kill 导致异常终止:7143518:没有此类进程启动命令失败。杀死:7405740:没有这样的过程

警告:核心文件不是完整核心。某些信息可能不可用。

4

0 回答 0