通过阅读更多文档,我找到了满足我这两个要求的解决方案。
在应用程序退出时退出 supervisord
这可以通过使用自定义事件监听器来实现。我必须将以下部分添加到我的 supervisord 配置文件中:
[eventlistener:shutdownevent]
command=/shutdownhandler.sh
events=PROCESS_STATE_EXITED
supervisord 将启动引用的脚本,并在触发给定事件时(在其中一个托管程序退出后触发 PROCESS_STATE_EXITED 并且它不会自动重新启动)将在脚本 stdin 上发送包含有关事件数据的行。
引用的 shutdownhandler-script 包含:
#!/bin/bash
while :
do
echo -en "READY\n"
read line
kill $(cat /supervisord.pid)
echo -en "RESULT 2\nOK"
done
脚本必须通过在其标准输出上发送“READY\n”来指示准备就绪,之后它可能会在其标准输入上接收到一个事件数据行。对于我在收到一行时的用例(意味着其中一个托管程序已退出),一个 SIGTERM 被发送到由它留在其 pid 文件中的 pid 找到的 supervisord 进程(默认情况下位于根目录中)。为了技术的完整性,我还为事件监听器提供了一个肯定的答案,尽管这个答案并不重要。
在标准输出上标记输出
我通过在启动 supervisord 之前在后台启动一个尾部进程来完成此操作,拖尾程序输出日志并通过 ts (来自 moreutils 包)将行通过管道添加到它前面。通过这种方式,它通过 docker logs 显示出来,并以一种简单的方式来查看哪个程序实际编写了该行。
tail -fn0 /var/log/supervisor/program1.log | ts '[Program 1]' &