我有一个守护进程,用于进行配置管理。所有其他进程都应该与此守护进程交互以确保其正常运行。但是,在执行大型操作后,几个小时后,守护进程会出现2到3个小时的无响应状态。之后,它会恢复正常。
Linux进程挂起问题的调试工具?
如何确定Linux进程挂起的位置?
每个工具都可以提供一点信息,这些信息共同构成了问题的完整画面。
使用gdb时,当应用程序被阻塞时触发核心转储可能很有用。然后,您就可以使用事后调试对静态快照进行分析。您可以通过脚本触发这些操作。然后,您可以快速构建一组快照,这些快照可用于测试您的理论。
一种选择是使用 gdb
并使用 attach
命令来附加到正在运行的进程。您需要加载一个包含所讨论可执行文件符号的文件(使用 file
命令)。
gdb /path/to/executable PID
来完成此操作。 - R Samuel Klatchko有许多不同的方法可以实现:
监听UNIX域套接字,以处理状态请求。然后外部应用程序可以查询应用程序是否仍然正常运行。如果在一定的超时时间内没有得到响应,则可以假定被查询的应用程序已经死锁或已经停止运行。
定期触发具有预选路径的文件。外部应用程序可以查看文件的时间戳,如果它已过期,则可以假定该应用程序已经停止运行或死锁。
您可以重复使用alarm
系统调用,并使用信号终止进程(相应地使用sigaction)。只要您不断调用alarm
(即只要您的程序正在运行),它就会继续运行。一旦您不再这样做,信号将触发。
您可以使用fork
和waitpid
无缝地重新启动进程,如此答案所述。这不会消耗任何重要资源,因为操作系统将共享内存页面。
ps ax
不是检测忙循环的好工具,top
在这方面做得更好。 - Dmitry Yudakov