특정 디렉터리의 파일을 처리하는 데몬을 실행하고 있습니다. 나는 그들을 하나씩 처리하고 싶다. 그래서 아이디어는 데몬 디렉터리에 파일을 하나씩 복사하고 해당 로그를 추적하는 것입니다. 로그 파일이 처음 처리를 완료하면 두 번째 파일을 데몬 디렉터리에 복사해야 합니다. 즉, 로그 파일 업데이트가 중지됩니다.
어떻게 해야 하나요? 설명하다
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 100
1초 동안 잠자기. 내장된 제외와 같습니다 sleep 1
. 또한 일반적으로 매초마다 파일에서 새 입력이 있는지 확인합니다(Linux에서는 일부 구현에서는 들어오는 입력을 감지하기 위해 inotify를 사용하지만).zselect
tail -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