파일의 변경 사항을 모니터링하는 셸 명령-다시 호출이란 무엇입니까?


159

유닉스에는 파일을 모니터링하고 파일에 쓰여지는 변경 사항을 보는 데 사용할 수있는 명령이 있다는 것을 알고 있습니다. 이것은 특히 로그 파일을 확인하는 데 매우 유용했습니다.

그것이 무엇인지 알고 있습니까?

답변:


213

당신은 의미합니까

tail -f logfile.log

?

( 꼬리 설명서 페이지 )


6
예, 실시간입니다.
— Adam Gibbins

18
참고 : 배포에서 tailf 명령을 제공하는 경우 tail -f보다 우선적으로 사용하십시오. tailf는 기록되지 않은 경우 감시 된 파일에 액세스 할 필요가 없기 때문에보다 효율적입니다 (한 번 업데이트하여 파일 시스템을 마운트하면 폴 액세스가 성가시다).
— Mihai Limbăşan

10
에서 슈퍼 유저 내가 대답을 발견 추천 꼬리 -F 대신 -f를 도
— 라파

17
tail -F파일 개체가 아닌 파일 이름을 따르므로 로그 파일 회전의 경우 특히 유용합니다.
— Amir Ali Akbari

2
몇 년 후 업데이트 : tailf이제 더 이상 사용되지 않으며 tail -f안전합니다. (시스템에서이를 확인 man tailf하십시오.) 설명서를 참조하십시오 : man7.org/linux/man-pages/man1/tailf.1.html
— exp1orer

124

Jon Skeet의 답변에 따라 아마도 꼬리를 의미했을 것입니다.

또 다른 유용한 것은 watch입니다 . 주기적으로 명령을 실행하고 출력을 전체 화면으로 볼 수 있습니다. 예를 들면 다음과 같습니다.

watch -n 10 -d ls -l / var / adm / messages

ls -l /var/adm/messages10 초마다 명령을 실행하고 후속 실행 간의 출력 차이를 강조 표시합니다. (예를 들어, 로그 파일이 얼마나 빨리 커지는 지 보는 데 유용합니다).


38

inotifywait에서 inotify를-도구 는 명령을 파일 (또는 디렉토리의 모든 파일) 변경을 할 때마다 실행하려는 경우에 유용합니다. 예를 들면 다음과 같습니다.

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

그냥 참고 path변수 이름에 대한 가장 큰 선택이 아니다. 에 zsh환경 변수는 대소 문자를 구분하지 않는 것 같습니다. 나에게는 설정 path원인 PATH도 설정되며, 기본적으로 문제를 해결할 때까지 아무것도 실행되지 않습니다. On bash으로 설정 path하면 영향을 미치지 않습니다 PATH.
— Thanatos

36

특정 오류 또는 ID에 대한 로그 파일을 검색해야하기 때문에 less +FG1 이상을 선호합니다 tail -f. 무언가를 검색해야하는 경우 ^C파일 팔로우 를 중단하고 ?뒤로 검색을 시작 하려면 입력 합니다.

키 바인딩은와 거의 동일합니다 vi. +옵션을 사용하여 시작시 모든 명령을 초기화 할 수 있습니다 .

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

정말 긴 로그의 경우 -n줄 번호 매기기를 해제 하는 옵션 을 사용하는 것이 편리하다는 것을 알았습니다 . 맨 페이지에서 :

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

의견에서 이것을 지적 하기 위해 rgmarcha에 대한 모자 팁 .


alias원하는 옵션 으로 설정해야합니다 . 매번 입력하지 않아도됩니다.
— Michael Hampton

실제로 대부분의 경우 별칭보다 셸 함수를 선호해야합니다.
— tripleee 08

21

꼬리가 중대하다 ... 이하도 덜 파일에 즉 덜 myfile을 누릅니다 시작 사용할 수있는 Shift+를 F. 이것은 꼬리 역할을 덜합니다.


5
less + F myfile도 그것을 만들 것입니다
— rgmarcha

16

LaTeX 파일을 편집하고 있으며 중간에 변경 사항이 있는지 모니터하고 싶습니다. 나는 나에게 유용한 다음과 같은 작은 쉘 스크립트를 채웠다. 다른 사람에게도 도움이되기를 바랍니다.

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

다른 이름으로 저장 watch.sh하고 수행하십시오 chmod u+x watch.sh. 그런 다음 다음과 같이 실행합니다.

./watch.sh file.tex pdflatex

실제 수정이 수행 된 경우에만 명령을 실행하려면 `md5sum "$FILE"`대신 대신 사용할 수 있습니다 `ls -l "$FILE"`.


1
단일 파일 대신 디렉토리와 내용을 보려면 :NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
— Andy


6

커널 inotify 서브 시스템에 연결되는 inotifywatch / inotifywait를 사용할 수도 있습니다. 이 방법으로 "열기", "닫기"또는 "액세스"와 같은 것을 볼 수도 있습니다.

그러나 단순히 stdout에 추가 된 줄을 얻으려면 꼬리에 동의합니다.


3

Tail은 유닉스 도구로 어디서나 사용할 수있는 표준이며 전통적입니다. 좀 더 정교한 도구는 여러 파일을 동시에 모니터링하고 구문 강조를 수행하는 멀티 테일 입니다.


3

꼬리를 추가하는 것 외에도 파일을 검색하려면 "F"명령을 적게 사용합니다.

tail을 사용할 때 파일이 롤오버되거나 편집으로 바뀌면 추가 인수가 필요하다는 것을 명심하십시오 (vim의 기본 모드 : w).

tail -f는 tail이 파일 디스크립터를 저장하고 따르게합니다. 파일이 교체되면 설명자가 변경됩니다. 파일 디스크립터를 따르는 것의 장점은 파일 이름이 바뀌더라도 여전히 파일을 따르게된다는 것입니다.

tail --follow =는 이름이 바뀐 파일을 정기적으로 다시 열어 이름이 바뀐 파일이 있는지 확인합니다.

--retry는 로그 파일에 꼬리를 붙이고 싶지만 파일이 아직 생성되지 않은 경우 유용한 또 다른 옵션입니다.

tail -F는 --follow = --retry에 대한 바로 가기입니다.


2

tailf를 잊어라, diff는 원하는 명령이다. 다음은 두 파일 사이에서 또는 한 파일에 쓰여지는 파일 사이의 차이를 실시간으로 확인하는 좋은 방법입니다.

이러한 방법을 사용하여 기록을 유지하기 위해 파일에 변경 사항을 작성하는 등 원하는 방식으로 동작을 수정할 수 있습니다. 시계 간격 또는 아래 명령에 대한 다른 옵션으로 놀아보십시오.

파일이 1 개 있으며 파일이 변경 될 때보고 싶습니다.

그래서 여기에 무엇을해야합니까?

  1. 파일을 복사

cp file file2

  1. 차이점을 찾기 위해 bash 스크립트를 작성하고 file2를 업데이트하십시오.

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. 다음은 스크립트에 대한 기본 아이디어입니다. 원하는 경우 파일에 쓰십시오

#!/bin/bash

diff file file2

cp file file2

  1. 다음으로 watch를 사용하여 화면의 차이점을 볼 수 있습니다

watch ./check-differences

기본적으로 2 초마다 업데이트됩니다. 따라서 돌아가서 읽어야하는 경우 diff의 출력을 스크립트의 파일에 씁니다.

또는 출력을 볼 필요가 없으면 cron을 사용하여 정기적으로 스크립트를 실행하십시오.


1

하지만 tail -f somefile.txt새로운 데이터로 계속 스크롤, 나는 때때로 선호하는 less +G somefile.txt파일의 최신 데이터의 패치를보고뿐만 아니라.


4
나는 그것이 7 년 전부터이 답변에 모두 포함되어 있다고 생각합니다 .
— kasperd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.