当前位置: 首页 > 面试题库 >

我如何转储所有Go进程的堆栈而不杀死它?

颜永怡
2023-03-14
问题内容

Go进程正在运行。我想要

  1. 为每个goroutine转储堆栈跟踪
  2. 从外部,而不依赖于我添加到其源代码的任何内容
  3. 没有杀死它。

我怎样才能做到这一点?

这应该很容易-请求该功能:https :
//code.google.com/p/go/issues/detail?id=2516并根据该线程的结论进行了实施。那是两年多以前了。但是问题线程和提交都没有任何有关如何调用此功能的提示。

功能请求提到了 SIGQUIT
,这是JVM接受在那里调用相应功能的信号。但是SIGQUIT并不是答案。至少在go1.2上,SIGQUIT会执行#1和#2的操作,但也会终止进程。

不久前有人在这里问了一个相关的问题:如何转储goroutinestacktraces?但是他们没有明确要求#2或#3,没有一个答案符合#2,他们接受了一个不符合#2的答案。所以这是一个不同的问题。


问题答案:

如果您使用的是net / http,则可以通过调试处理程序访问goroutine。如果您看以下资料

http://golang.org/src/pkg/runtime/pprof/pprof.go

您将goroutineProfile在第62行看到配置文件。该配置文件通过写入writeGoroutine。如果使用debug> =2调用writeGoroutine,则它将写出所有goroutine。

您应该能够将curl http://localhost:<port>/debug/pprof/goroutine?debug=2所有goroutines转储。不幸的是,我没有看到任何调用该代码的信号处理程序的引用,但是您可以在runtime.Stack上面的源代码中看到有关pprof如何利用它来轻松实现自己的引用。



 类似资料:
  • 问题内容: 因为我在那里看到很多进程,所以“时间”列显示了所有这些进程的重要价值。 问题答案: 您需要一个一个地杀死它们,MySQL没有任何大量的kill命令。您可以使用任何语言编写脚本,例如在PHP中,您可以使用类似以下内容的脚本:

  • 问题内容: 我正在尝试转储所有活动线程的列表,包括每个线程的当前堆栈。我可以使用threading.enumerate()获得所有线程的列表,但是我不知道从那里到堆栈的方法。 背景:Zope / Plone应用程序有时会出现故障,消耗100%的cpu,需要重新启动。我觉得这是一个循环,无法正常终止,但是我无法在test- environemt中重现该循环以进行验证。我设法注册了可以从外部触发的信号

  • 我得到了一个用java编写的应用程序,它在Unix上运行,并在启动时启动两个子进程(via)。如果应用程序因某种原因崩溃,子进程不会被杀死。 现在,我添加了一个关闭钩子,每次崩溃都会触发它,到目前为止还可以。但是我想在UNIX控制台上为应用程序的每个子进程发送一个SIGTERM信号(或至少SIGINT)。我应该能够通过找到他们的进程ID,但是我没有正确提取PID并为每个进程发送信号。 有人能帮忙吗

  • null 正在停止现有后台进程

  • 问题内容: 有时,当我尝试启动Firefox时,它会显示“ Firefox进程已在运行”。所以我必须这样做: 我想要的是一个可以为我完成所有任务的命令。它会在进程列表中使用一个输入字符串并将其(或其他内容)放入其中,并杀死输出中的所有进程: 我尝试在PHP中执行此操作,但似乎只显示已在PHP脚本本身中执行过的进程(因此,它显示的唯一进程是其自身。) 问题答案: 详细信息:http : //linu

  • 问题内容: 我在前台启动了我的程序(守护程序),然后用杀死了它,但剩下一个僵尸,无法用杀死它。如何杀死僵尸进程? 如果僵尸是一个死进程(已被杀死),我如何将其从输出中删除? 问题答案: 僵尸已经死了,所以您无法杀死它。要清理僵尸,必须等待其父级等待,因此杀死父级应该可以消除僵尸。(父对象死后,僵尸将被pid 1继承,而pid 1将等待该僵尸并清除其在进程表中的条目。)如果守护程序正在生成成为僵尸的