В моем скрипте Python мне нужен был быстрый / эффективный способ установить максимальный размер файла для файла, в который я постоянно пишу. Вместо того, чтобы переносить все это в оперативную память py, я выполнил эту команду оболочки:
sed -i '1d' file.csv
Я периодически отслеживаю размер файла и запускаю команду по мере необходимости. Проблема в том, что теперь, если я tail -f file.csv
, tail перестает отслеживать файл, как только sed удаляет из него строку. Любое решение?
Майкл Хэмптон предлагает очевидное tail -F
, но лично я в основном использую less
В наше время:
less --follow-name +F file.csv
Стенографической альтернативы не существует --follow-name
, Мне нужно использовать псевдоним:
alias less='less --follow-name -XFR'
Основная проблема sed
создает новый файл. Это показано в выдержке ниже:
$ 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
Насколько я знаю, нет простого способа обрезать начало файла.
Я бы посоветовал вашему приложению python прослушивать сокет unix / tcp и после его принятия поместить этот поток в каркас регистрации а затем используйте nc ... | tail
смотреть вывод.