로그를 추적하는 동안 bash 루프 파일

로그를 추적하는 동안 bash 루프 파일

특정 디렉터리의 파일을 처리하는 데몬을 실행하고 있습니다. 나는 그들을 하나씩 처리하고 싶다. 그래서 아이디어는 데몬 디렉터리에 파일을 하나씩 복사하고 해당 로그를 추적하는 것입니다. 로그 파일이 처음 처리를 완료하면 두 번째 파일을 데몬 디렉터리에 복사해야 합니다. 즉, 로그 파일 업데이트가 중지됩니다.

어떻게 해야 하나요? 설명하다

daemon_dir=/var/daemon_dir/
daemon_log_file=/var/daemon/daemon_log

처리할 파일이 5개 있습니다(예: 파일 {1..5})

# ls -1
file1
file2
file3
file4
file5

따라서 내 루프는 그대로 진행되어야 합니다.

for file in file{1..5}
do
  cp ${file} ${daemon_dir}
  # daemon sees new file arriving in its dir, & starts processing
  # log is tailed
  tail -f ${daemon_log_file}
  # when log file stops updating say for 1minute or specified time, tail quits
done

그리고 루프는 다음 파일부터 시작됩니다.

답변1

zsh대신 을 사용하면 bash다음을 수행할 수 있습니다.

zmodload zsh/zselect
for file in file{1..5}; do
  cp -- $file $daemon_dir || exit
  touch -- $daemon_log_file
  while
    ()(($#)) $daemon_log_file(Nmm-1)
  do
    zselect -t 100
  done
done

( zselect -t 1001초 동안 잠자기. 내장된 제외와 같습니다 sleep 1. 또한 일반적으로 매초마다 파일에서 새 입력이 있는지 확인합니다(Linux에서는 일부 구현에서는 들어오는 입력을 감지하기 위해 inotify를 사용하지만).zselecttail -f

위에서 우리는 데몬이 파일 처리를 완료한 시기를 감지하기 위해 mm-1( 1inute m미만 전에 수정됨 ) glob 한정자를 사용했습니다.m

Linux를 사용하는 경우 IN_CLOSE_NOWRITE데몬이 입력 파일을 한 번만 열고(그리고 이 파일을 여는 유일한 데몬임) 파일을 처리하는 데 충분한 시간이 필요하다고 가정하여 파일에서 inotify 이벤트를 모니터링할 수 있습니다. 시계를 설정하다

for file in file{1..5}; do
  cp -- "$file" "$daemon_dir" || exit
  inotifywait -qqe close_nowrite -- "$daemon_dir/$file" 
done

- 기반 접근 방식 의 경우 tail -f다음을 수행할 수 있습니다(zsh 사용).

zmodload zsh/system
tail -f -- $daemon_log_file |
  for file in file{1..5}; do
    cp -- $file $daemon_dir || exit
    while sysread -t 60 -o 1; do
      continue
    done
  done

관련 정보