sed에서 줄을 제거하면 꼬리가 끊어집니다.

sed에서 줄을 제거하면 꼬리가 끊어집니다.

내 Python 스크립트에서는 지속적으로 쓰는 파일에 최대 파일 크기를 설정하는 빠르고 효율적인 방법이 필요했습니다. 모든 것을 py의 RAM으로 가져오는 대신 다음 쉘 명령을 실행했습니다.

sed -i '1d' file.csv

파일 크기를 주기적으로 모니터링하고 필요에 따라 명령을 실행합니다. 문제는 이제 I 경우 tail -f file.csvsed가 파일에서 한 줄을 제거하자마자 tail이 파일 추적을 중지한다는 것입니다. 어떤 해결책이 있습니까?

답변1

기본적인 문제는 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출력을 보는 데 사용합니다.

답변2

마이클 햄튼명백한 것을 제안 tail -F하지만 요즘에는 개인적으로 주로 다음을 사용합니다 less.

less --follow-name +F file.csv

에 대한 간략한 대안이 없으므로 --follow-name별칭을 사용해야 합니다.

alias less='less --follow-name -XFR'

관련 정보