redireciona a saída do script python para o arquivo

1

Como obtenho a saída deste script python para anexar a um arquivo de log

sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2 não funciona. Nenhuma mensagem de erro, apenas um arquivo de log não modificado vazio.

Se eu fizer apenas sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir , a saída será enviada para o console conforme o esperado.

Por fim, sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2 é executado a partir de um script como um serviço pelo systemd, mas não acho que seja relevante, pois quando eu o executo manualmente a partir da linha de comando, ele ainda não faz log.

Em todos os casos, o script realmente faz o trabalho corretamente, eu simplesmente não consigo obter sua saída em um log.

O script python apenas incase importa:

#!/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])

Edit: Aparentemente sudo inotifywait -mr --format '%e%w%f' --event move $srdir | sudo python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2 executado a partir da linha de comando funciona. Observe o segundo sudo antes de invocar python. No entanto, quando executado pelo systemd, tudo é root por padrão e ainda não é enviado para o log.

    
por Geo R 21.11.2016 / 05:22

1 resposta

1

De link

I don't know if this applies to python as well, but I think it depends on the operating system that you are running.

On Linux for example, output to terminal flushes the buffer on a newline, whereas for output to files it only flushes when the buffer is full (by default). This is because it is more efficient to flush the buffer fewer times, and the user is less likely to notice if the output is not flushed on a newline in a file.

You might be able to auto-flush the output if that is what you need.

Portanto, no script python, adicionando sys.stdout.flush() depois que a gravação faz com que ela se comporte como esperado.

Meh.

    
por 22.11.2016 / 07:15