当它与 supervisord 在后台运行时,如何将 Ctrl-C 发送到 dotMemory 命令行 CLI?

How to send Ctrl-C to dotMemory command line CLI when it runs in background with supervisord?

我有多个 .NET Core 程序 运行 在 Ubuntu 后台使用 supervisord(见下文)。 supervisord.conf 位于 Hello-World 文件夹中。

[program:hello-world-1]
command = /all-hello-worlds/dotMemory-Cli-Linux/tools/dotMemory.sh start-net-core --service-input=null --trigger-max-snapshots=5 --trigger-delay=2m --trigger-timer=00:01:00 Hello-World-1.dll
directory = /all-hello-worlds/Hello-World-1
autostart = true
autorestart = unexpected
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/2
stderr_logfile_maxbytes=0

在每个 supervisord.conf 中,我使用: dotMemory.sh start-net-core --trigger-delay=1m --trigger-timer=00:00:10 ./HelloWorld.dll

当 supervisord 在后台运行 .NET Core 程序时,我可以看到 dotMemory 打印消息说“按 Ctrl+C 结束分析”

那些 .NET Core 程序捆绑在一个运行 /usr/bin/supervisord -c /all-hello-worlds/supervisord.conf

的 Dorker 容器中

这是另一个名为 supervisord.conf 的 supervisord.conf,它位于 all-hello-worlds 文件夹中

; supervisor config file

[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
nodaemon = true   ; run in the background aka daemonizing

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.
[include]
files = /all-hello-worlds/*/supervisord.conf

您可以将 Ubuntu 中的文件夹结构可视化如下:

all-hello-worlds (root folder)
| --- dotMemory-Cli-Linux
| --- supervisord.conf
| --- Hello-World-1
   | --- Hello-World-1.dll
   | --- supervisord.conf
| --- Hello-World-2
   | --- Hello-World-2.dll
   | --- supervisord.conf

现在我很难将 Ctrl-C 命令发送到 supervisord Hello-World 进程。如果我使用supervisorctl stop Hello-World-1,dotMemory不能正确保存DMW文件,我需要使用dotMemory recover方法来获取DMW文件(很麻烦)

如果我使用 kill -SIGINT [dotMemory process ID],supervisord 会重新启动进程并且不会正确保存 DMW 文件。

有没有办法在后台用 supervisord 发送 Ctrl-C 命令到 dotMemory 运行? 我在这里附上了 2 supervisord.conf 个文件。

如果您需要我提供更多信息,请告诉我。 谢谢。

您使用通过单声道运行的旧 dotMemory 控制台版本。 kill -SIGINT [dotMemory process ID] 命令无法正常使用它。

但是,##dotMemory["disconnect"] 可以通过文件发送到标准输入:

  • 使用 --service-input 参数修改命令行:

dotMemory.sh start-net-core --service-input=<Path to service messages file>/dotMemoryInput.txt

  • 在您想要停止分析会话的那一刻,编辑文件:

echo '##dotMemory["disconnect"]' >> <Path to service messages file>/dotMemoryInput.txt

在这种情况下,分析会话将完成,工作区将被保存。

另一种方法是将dotMemory clt版本更新到2021.1.5。由于 2021.1 dotMemory 通过 dotnet 运行并且 kill -SIGINT [dotMemory process ID] 在此版本中正常工作,工作区已成功保存。