Python 스크립트의 출력을 파일로 리디렉션

Python 스크립트의 출력을 파일로 리디렉션

이 Python 스크립트의 출력을 로그 파일에 추가하려면 어떻게 해야 합니까?

sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2작동하지 않습니다. 오류 메시지는 없고 수정되지 않은 빈 로그 파일만 있습니다.

이렇게 하면 sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir예상대로 출력이 콘솔로 이동합니다.

결국 sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2서비스로 systemd에 의해 스크립트에서 실행되지만 명령줄에서 수동으로 실행하면 여전히 기록되지 않기 때문에 중요하지 않다고 생각합니다.

모든 경우에 스크립트는 실제로 작업을 올바르게 수행하지만 로그에 출력을 가져올 수 없습니다.

만일의 경우에 대비하여 Python 스크립트:

#!/usr/bin/python3
import sys
import time
from subprocess import call
src = ""
bkdir = sys.argv[1]
srdir = sys.argv[2]
while True:
        line = sys.stdin.readline()
        event, path = line.split("/",1)
        path="/"+path.rstrip();
        if event in  ["MOVED_FROM","MOVED_FROM,ISDIR"]:
                src = path.replace(srdir, bkdir, 1)
        if event in ["MOVED_TO","MOVED_TO,ISDIR"]:
                dst  =  path.replace(srdir, bkdir, 1)                    
                sys.stdout.write(time.strftime("%Y-%m-%d %H:%M:%S") + " mv " + src + " " + dst )
                call(["mv", src, dst])

편집: 분명히 sudo inotifywait -mr --format '%e%w%f' --event move $srdir | sudo python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2명령줄에서 실행하면 작동합니다. Python을 호출하기 전에 두 번째 sudo를 기록해 두십시오. 그러나 systemd로 실행하면 모든 것이 기본적으로 루트이며 여전히 로그에 출력되지 않습니다.

답변1

~에서https://stackoverflow.com/a/3167526/7192818

이것이 Python에도 적용되는지는 모르겠지만 실행중인 OS에 따라 다르다고 생각합니다.

예를 들어, Linux에서 터미널로의 출력은 개행 시 버퍼를 플러시하는 반면, 파일로의 출력의 경우 버퍼가 가득 찼을 때만(기본적으로) 플러시됩니다. 이는 버퍼를 덜 자주 플러시하는 것이 더 효율적이고 파일의 줄 바꿈에서 출력이 플러시되지 않는 경우 사용자가 알아차릴 가능성이 적기 때문입니다.

필요한 경우 출력을 자동으로 새로 고칠 수도 있습니다.

따라서 Python 스크립트에서 sys.stdout.flush()쓰기 후에 추가하면 예상대로 작동합니다.

음.

관련 정보