실시간 파일 수 모니터링
나는 bash 스크립팅을 처음 사용하고 특정 수의 파일이 시간 프레임 내에 전송 될 (예상되는) 경로를 모니터링하는 bash 스크립트를 작성하려고합니다. 오전 9 시부 터 오전 11 시까 지 올 것으로 예상되는 20 개의 파일이 있다고 가정 해 보겠습니다.
스크립트는 다음을 수행 할 수 있어야합니다.
- 파일이 소스에서 늦었는지 감지합니다. 오전 9시에 경로가 비어있는 경우 10 분의 유예 기간을 제공하고 소스가 파일을 늦게 전송한다는 이메일 알림을 보냅니다.
- 시간 프레임 내에 파일 세트가 불완전한 지 감지합니다. 10 분의 유예 기간을 제공하고 파일 수가 여전히 20 개가 아니면 파일 세트가 불완전하다는 이메일 알림을 보냅니다.
- 문제가 감지되지 않으면 확인 이메일을 보냅니다.
나는 incrontab에서 이것을 설정하려고 생각하고 있습니다. 스크립트는 파일 수가 완료되거나 오전 11시 10 분 (유예 기간 10 분)이 지난 경우에만 중지됩니다.
처음 두 가지를 달성하는 방법에 대한 조언이 필요합니다. 문제가 없을 것으로 예상되는 경우 만 다룰 수있었습니다. 나는 아이디어가 있지만 그것을 스크립트에 넣는 방법을 모릅니다.
지금까지 이것이 내가 가진 것입니다.
버전 1 :
#!/bin/bash
hour=(9 10 11)
[email protected]
[email protected]
if [[ "${hour[@]}" =~ "$(date +"%H")" ]]; then
if [[ $(ls /fake/path | wc -l) == 20 ]]; then echo -e "All files received" | mailx -s "All files received" -r $server $notify
fi
fi
( ls출력 구문 분석을 권장하지 않기 때문에 아래 스크립트를 업데이트했습니다.) :
버전 2 :
#!/bin/bash
hour=(9 10 11)
[email protected]
[email protected]
if [[ "${hour[@]}" =~ "$(date +"%H")" ]]; then echo $(date +"%Y-%m-%d %H:%M:%S") $1 >> /tmp/record.txt if [[ $(cat /tmp/record.txt | wc -l) == 20 ]]; then
echo -e "All files received" | mailx -a /tmp/record.txt -s "All files received" -r $server $notify
fi
fi
어떤 아이디어라도 환영합니다. 나는 이것을 잘못된 방식으로 보는 것일 수 있습니다.
답변
간단한 cron작업으로 할 수 있습니다 . 09:10파일 수가 0이면 확인하고 메일 알림을 보내고 11:10파일 수가 20 미만이면 at을 확인하고 싶다고 가정 해 보겠습니다 . 다음과 같은 스크립트를 사용하십시오.
#!/bin/bash
n="$1" message="$2"
target_dir="/full/path/to/directory"
cnt=$(find "$target_dir" -type f -printf '\n' | wc -l)
if (( cnt < n )); then
<your-mail-command-with-$message>
else
<do-anything>
fi
보시다시피 파일 수를 테스트하는 값과 메시지는 인수입니다. 그래서 당신은 할 수 있습니다
crontab -e
이 줄을 추가
10 9 * * * bash /full/path/to/the/scipt.sh 1 "No files yet"
10 11 * * * bash /full/path/to/the/scipt.sh 20 "Files less than 20"
파일을 저장하십시오. 이제 새로운 crontab이 설치되었습니다.
노트:
실행 시간과 시간은 쉽게 사용자 정의 할 수 있습니다. 최소한의 노력으로 두 번 또는 N 분마다 또는 원할 때마다 실행할 수 있습니다.
줄을 세고 메일을 한 번 보내는 코드를 작성합니다. 예상되는 파일 수, 보낼 메시지 등에 대한 매개 변수를 만들 수 있습니다. 간단하고 읽기 쉽습니다.
실제 개수
-printf는find명령 의 매개 변수를 사용합니다 . 모든 파일에 대해 개행 만 인쇄하고 개행을 계산하므로 모든 파일 이름이 처리됩니다.GNU bash가 가정했습니다.