i3blocks를 통해 실행될 때 Python 스크립트에는 stdout이 없습니다.

i3blocks를 통해 실행될 때 Python 스크립트에는 stdout이 없습니다.

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)

나중에 "test"를 실제 JSON 문자열로 바꿀 계획입니다. 디버깅 목적으로 이 버전으로만 제거하겠습니다.

명령줄에서 이 명령을 실행하면 test예상대로 5초마다 인쇄됩니다. PID를 얻고 다음 stdout을 통해 ps 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어느 시점에 모든 버퍼에 동시에 덤프되는 것처럼 보입니다.

이 문제에 대해 어떻게 해야 합니까?

답변1

감사해요무루님 댓글에 답을 찾았네요여기:

print("test")로 변경하면 print("test", flush=True)인쇄 직후 출력 버퍼가 플러시되어 문제가 해결되었습니다.

관련 정보