br removendo a linha quebra a cauda

1

No meu script Python, eu precisava de uma maneira rápida / eficiente de definir um tamanho máximo de arquivo em um arquivo que estou constantemente escrevendo. Em vez de trazer tudo para a RAM do py, executei este comando shell:

sed -i '1d' file.csv

Eu monitora o tamanho do arquivo periodicamente e executo o comando conforme necessário. O problema é que agora, se eu tail -f file.csv , o tail parar de seguir o arquivo assim que o sed remover uma linha dele. Alguma solução?

    
por xendi 08.09.2018 / 18:00

2 respostas

1

O problema básico é sed cria um novo arquivo. Isso é mostrado 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

Não há, até onde eu sei, uma maneira fácil de truncar o início de um arquivo.

Eu sugiro que seu aplicativo python seja escutado em um soquete unix / tcp e, uma vez aceito, coloque esse fluxo no estrutura de registro e, em seguida, use nc ... | tail para assistir a saída.

    
por 09.09.2018 / 01:55
1

Michael Hampton sugere o óbvio tail -F , mas eu pessoalmente uso principalmente less nos dias de hoje:

less --follow-name +F file.csv

Não havendo alternativa abreviada para --follow-name , eu tenho que usar um apelido:

alias less='less --follow-name -XFR'
    
por 13.09.2018 / 17:18

Tags