No meu script Python, eu precisava de uma maneira rápida/eficiente de definir um tamanho máximo de arquivo em um arquivo no qual estou constantemente gravando. Em vez de trazer tudo para a RAM do py, executei este comando shell:
sed -i '1d' file.csv
Eu monitoro o tamanho do arquivo periodicamente e executo o comando conforme necessário. O problema é que agora, se I tail -f file.csv
, tail para de seguir o arquivo assim que sed remove uma linha dele. Qualquer solução?
Responder1
O problema básico é sed
criar um novo arquivo. Isso é demonstrado pelo extrato abaixo:
$ strace -fe trace=file,read,write,close sed -i '1d' /tmp/x.csv
....
openat(AT_FDCWD, "/tmp/x.csv", O_RDONLY) = 3
...
openat(AT_FDCWD, "/tmp/sed1nFxY1", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
write(5, NULL, 0) = 0
read(3, "1,1,1,1\n2,2,2,2\n3,3,3,3\n", 4096) = 24
write(4, "2,2,2,2\n", 8) = 8
write(4, "3,3,3,3\n", 8) = 8
read(3, "", 4096) = 0
close(3) = 0
close(4) = 0
rename("/tmp/sed1nFxY1", "/tmp/x.csv") = 0
close(1) = 0
close(2) = 0
Até onde eu sei, não existe uma maneira fácil de truncar o início de um arquivo.
Eu sugiro que seu aplicativo python escute em um soquete unix/tcp e, uma vez aceito, coloque esse fluxo noestrutura de registroe use nc ... | tail
para observar a saída.
Responder2
Michael Hamptonsugere o óbvio tail -F
, mas eu pessoalmente uso principalmente less
hoje em dia:
less --follow-name +F file.csv
Não havendo alternativa abreviada para --follow-name
, tenho que usar um alias:
alias less='less --follow-name -XFR'