Supervisor 激活一些子进程。
我这样配置它们:
[program:XXXXX]
command=/XXXXX/XXXXX
directory=/XXXXXX
autostart=true
autorestart=true
startsecs=3
startretries=10000
stdout_logfile=/XXXXXX/stdout.log
stdout_logfile_maxbytes=1MB
stderr_logfile=/XXXXXX/stderr.log
stderr_logfile_maxbytes=1MB
其中一个过程是生成大量屏幕输出,我希望在测试期间实时读取这些输出:每秒打印 5 行。
他们现在已经登录了stdout.log
。
我想stdout.log
和一起阅读
watch -0.1 tail /XXXXX/stdout.log
但我发现它在收到每一行时都没有更新:日志内容可能会被缓存,直到达到某个预定义的大小,然后再保存到文件中。
我不需要保留标准输出以供将来参考。
是否有可能将主管设置为持续更新 stdout.log
?
或者,为了避免从长远来看损坏磁盘,是否有可能打印回最后 X 行stdout
而不将其保存到stdout.log
?
答案1
如果您想避免损坏磁盘(我已经很久没有看到有人担心这个问题了),您可以创建一个 ramdisk 来将这些日志文件定向到如下所示:
mkdir /var/log/tmplogs
mount -t tmpfs -o size=5m tmpfs /var/log/tmplogs
或者采用 fstab 格式:
tmpfs /var/log/tmplogs nodev,nosuid,noexec,nodiratime,size=5M 0 0
然后使用该/var/log/tmplogs
目录作为这些文件的目标位置。
这不会解决所说的任何日志缓冲问题。但通常延迟是由您的命令缓冲其输出引起的(有或没有 tty 时它的行为可能有所不同)而不是由supervisord引起的,您可以确认遵循supervisord中的示例第803期。
是否可以设置Supervisor持续更新stdout.log?
我会说不,因为它已经应该在收到后立即写入日志,并且大多数情况下这不是主管问题,但是如果没有启动命令,则无法通过以下方式判断您是否遇到了错误或者是否正常你的命令。