我有一个进行配置管理的守护进程。所有其他进程都应该与这个守护进程交互以实现其功能。但是当我执行一个大动作时,在几个小时后,守护进程在2到3个小时内没有响应。并且2-3小时后它正常工作。为Linux进程挂起问题调试实用程序?
调试Linux进程挂起问题的实用程序?
如何获得Linux进程挂起的点?
我有一个进行配置管理的守护进程。所有其他进程都应该与这个守护进程交互以实现其功能。但是当我执行一个大动作时,在几个小时后,守护进程在2到3个小时内没有响应。并且2-3小时后它正常工作。为Linux进程挂起问题调试实用程序?
调试Linux进程挂起问题的实用程序?
如何获得Linux进程挂起的点?
一个选项是使用gdb
并使用attach
命令为了附加到正在运行的进程。您将需要加载包含可执行的有问题的符号(使用file
命令)
这些都可能给出一些信息,这些信息一起构成了问题的图片。
使用gdb时,在应用程序被阻止时触发核心转储可能很有用。然后你有一个静态快照,你可以在你的闲暇时使用验尸调试进行分析。你可以让这些脚本触发它们。你快速建立一组快照,可以用来测试你的理论。
我不认为'ps ax'是检测繁忙循环的好工具,'top'会更好这个 – 2010-06-14 06:11:45
你当然是对的,我倾向于使用这些几乎总是并排的,所以他们混淆了我的脑海。谢谢,我更新了答案 – 2010-06-14 07:28:17
嗨,彼得, strace帮助我解决了挂起问题。 挂起是因为使用'flock()'的文件锁定的两个进程之间的死锁场景。 非常感谢您的帮助。如果没有了解,那么找出这个过程为何悬而未决是一项不可能完成的任务。 – Niranjan 2010-06-17 09:18:05
有做了许多不同的方式:
监听一个UNIX域套接字,来处理状态请求。然后外部应用程序可以询问应用程序是否仍然正常。如果在某个超时期限内没有得到任何回应,那么可以认为被查询的应用程序已经死锁或者死机。
定期触摸具有预选路径的文件。外部应用程序可以查看该文件的时间戳,如果该文件已过时,则可以认为该应用程序已死或死锁。
您可以反复使用alarm
系统调用,使信号终止进程(相应地使用sigaction)。只要您继续拨打alarm
(即只要您的程序正在运行),它就会继续运行。一旦你不这样做,信号就会发射。
,因为它与fork
和waitpid
死亡描述in this answer您可以无缝地重新启动过程。它不会花费任何重要的资源,因为操作系统将共享内存页面。
你也可以直接从'gdb/path/to/executable PID'的命令行执行此操作' – 2010-06-14 05:47:11