In meinem Python-Skript brauchte ich eine schnelle/effiziente Möglichkeit, eine maximale Dateigröße für eine Datei festzulegen, in die ich ständig schreibe. Anstatt das Ganze in den RAM von py zu bringen, habe ich diesen Shell-Befehl ausgeführt:
sed -i '1d' file.csv
Ich überwache die Dateigröße regelmäßig und führe den Befehl bei Bedarf aus. Das Problem ist, dass tail -f file.csv
tail jetzt aufhört, die Datei zu tailen, sobald sed eine Zeile daraus entfernt. Irgendeine Lösung?
Antwort1
Das Grundproblem besteht darin, dass sed
eine neue Datei erstellt wird. Dies wird durch den folgenden Auszug veranschaulicht:
$ 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
Es gibt, soweit ich weiß, keine einfache Möglichkeit, den Anfang einer Datei abzuschneiden.
Ich würde vorschlagen, Ihre Python-Anwendung so einzurichten, dass sie auf einem Unix/TCP-Socket lauscht, und diesen Stream nach der Annahme in denProtokollierungsframeworkund verwenden Sie dann, nc ... | tail
um die Ausgabe anzusehen.
Antwort2
Michael Hamptonlegt das Offensichtliche nahe tail -F
, aber ich persönlich verwende less
heutzutage meistens:
less --follow-name +F file.csv
Da es keine Kurzalternative zu gibt --follow-name
, muss ich einen Alias verwenden:
alias less='less --follow-name -XFR'