在 i3blocks 中,我定义了一个像这样的块:
~/.config/i3blocks/config
:
[test]
interval=persist
format=json
对应的可执行脚本
~/.config/i3blocks/config.scripts/test
:
#!/usr/bin/python
from time import sleep
while True:
print("test")
sleep(5)
我打算稍后用实际的 JSON 字符串替换“test”,我只是将其剥离到此版本以进行调试。
当我在命令行上执行此命令时,按预期每 5 秒test
打印一次。stdout
我可以通过以下方式获取 PIDps aux
并进行检查strace
:
$ sudo strace -p82267 -s9999 -e write
strace: Process 82267 attached
write(1, "test\n", 5) = 5
write(1, "test\n", 5) = 5
[...]
ps aux
还向我显示了 i3blocks 已启动的其他进程。strace
这个过程没有给我任何输出,我不明白为什么。循环似乎正在运行,但没有stdout
。为了验证这一点,我删除了循环并重新启动了 i3blocks,该进程不再列出。
为什么 i3blocks 启动进程时没有出现stdout
,我该怎么办?
编辑:
我让它运行了很长一段时间,然后注意到:strace
向我展示了一大堆文本被stdout
一次性转储到所有:
$ sudo strace -p79878 -s9999 -e write
strace: Process 79878 attached
--- SIGSTOP {si_signo=SIGSTOP, si_code=SI_USER, si_pid=79873, si_uid=1000} ---
--- stopped by SIGSTOP ---
--- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=79873, si_uid=1000}
write(1, "test\ntest\n[...a big big block of output here...]test\ntest", 8194) = 8194
SIGSTOP 和 SIGCONT 也发生了几次。
因此,输出似乎在某个缓冲区中存储了很长时间,然后stdout
在某个时刻一次性转储到所有缓冲区。
对此我能做什么?