테일링 프로세스를 중지하기 위해 파일에 EOF를 작성하려고 합니다.

테일링 프로세스를 중지하기 위해 파일에 EOF를 작성하려고 합니다.

파일을 추적하는 여러 프로세스가 있습니다. 파일에 EOF를 작성하여 추적 프로세스를 중지하려면 어떻게 해야 합니까?

예를 들어,

tail -F $HOME/somefile.log

어딘가의 일부 터미널에서 실행되고 있지만 어디에 있는지는 확실하지 않습니다. 파일을 추적하는 모든 프로세스가 파일 추적을 중지하도록 로그 파일에 EOF를 작성하려면 어떻게 해야 합니까?

어떤 경우에는 fifo를 추적합니다.

mkfifo fivel
tail -f fivel

명명된 파이프에 EOF를 쓰면 실제로 fifo 뒤에 오는 모든 프로세스가 중지/종료될 수 있지만 일반 파일에 EOF를 쓰면 후행 프로세스가 중지되지 않을 수 있다고 생각합니다.

답변1

tail 명령은 일반 파일에서 -f와 함께 실행될 때 EOF에서 종료되지 않습니다. 명시적으로 더 많은 데이터를 기다립니다. 따라서 파일 끝에 이미 EOF가 있습니다. 종료되어서는 안 되기 때문에 tail이 종료되지는 않습니다.

유일한 방법은 꼬리를 죽이는 것입니다. 달리기

ps ax|grep tail

그런 다음 설치 테일 프로세스에 표시된 프로세스 ID를 종료합니다. 또는 사용

pkill tail

모든 테일 프로세스를 종료합니다. 종료하고 싶지 않은 프로세스를 종료할 수 있으므로 이 옵션을 사용할 때 주의하세요.

답변2

나에게는 이것이확실히이를 달성하는 올바른 방법인 것 같습니다. 파일 자체보다는 파일을 읽는 테일 프로세스를 대상으로 삼고 싶다고 생각합니다. 다음과 같은 것을 고려하십시오.

ps -ef | grep "[t]ail" | grep 'somefile.log' | tr -s ' ' | cut -d' ' -f2 | xargs kill
  1. ps -ef시스템에서 실행 중인 모든 프로세스가 표시됩니다.
  2. grep "[t]ail"이름에 tail이 포함된 모든 프로세스가 검색됩니다(이 grep 제외).
  3. grep 'somefile.log'이름에 somefile.log가 포함된 파일이 이 파일 중에서 발견됩니다.
  4. tr -s ' '여러 공간을 모두 하나로 압축합니다.
  5. cut -d' ' -f2두 번째 열, 즉 공백을 구분 기호로 사용하는 PID만 가져옵니다.
  6. xargs kill해당 PID를 종료합니다.

이렇게 하면 파일을 읽는 모든 테일 프로세스가 종료됩니다(tailsomefile.log라는 로그 파일과 같은 일부 이상한 경우는 제외). 아마도 이 작업을 수행하는 더 깔끔한 방법이 있을 것입니다. 그러나 이것이 나에게 첫 번째로 즉시 확실한 해결책이었습니다. Linux에서 작동하도록 테스트했습니다.

관련 정보