some_log_file.log 파일에 출력을 쓰는 쉘 스크립트가 있습니다.
{
some logic..
if grep -iq "No such file or directory" some_log_file.log ; then
some logic to send email.. attaching the same some_log_file.log
fi
} >> some_log_file.log 2>&1
위의 코드를 보면 스크립트가 실행 중일 때 기록 중인 동일한 로그 파일을 확인하고 있음을 알 수 있습니다. 이것은 작동합니다. 그러나 이것이 허용되고 표준입니까?
답변1
예, 허용됩니다. 아니요, 이것은 매우 일반적이거나 표준이 아니라고 생각합니다. 그러나 이제 작동하므로 그대로 둘 수 있습니다.
그러나 Panki의 관점에서는 로그를 grep하는 것보다 "해당 파일이나 디렉터리 없음"을 보고할 수 있는 명령의 종료 상태(반환 상태라고도 함)를 확인하는 것이 더 좋고 더 효율적일 것입니다.
$? 변수에는 항상 실행된 마지막 명령의 종료 상태가 포함됩니다. 일반적으로 0은 명령이 성공적으로 실행되었음을 나타냅니다. 양수 값(1, 2, 99 등)인 경우 이는 일종의 오류를 나타냅니다. 예를 들어:
>> ls /usr/bin/sed
-rwxr-xr-x 1 root wheel 202960 May 9 15:30 /usr/bin/sed
>> echo $?
0
>> ls -l nonexistent_file
ls: nonexistent_file: No such file or directory
>> echo $?
1
명령에서 "해당 파일이나 디렉터리가 없습니다"라고 보고할 수 있습니다. ftp가 무엇인가요? 단순화를 위해 "ls"라고 가정해 보겠습니다. 스크립트는 다음과 같습니다.
ls $my_file # Or whatever your command is.
if [ $? = 1 ]; then
# Send mail ...
fi
# Alternatives:
ls $my_file # Or whatever your command is.
if [ $? != 0 ]; then
# Send mail ...
fi
ls $my_file # Or whatever your command is.
status=$?
case $status in
0) : ;; # Success, do nothing.
1) Send mail ... ;;
*) echo "Error: \"ls $my_file\"." returned status $status."
exit 99;;
esac
명령이 ftp인 경우 명령에는 아래에 설명된 더 복잡한 상태 코드가 있습니다.
https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes
그리고 여기:
https://docs.microsoft.com/en-us/troubleshoot/developer/webapps/iis/ftp-service-svchost-inetinfo/ftp-status-codes-iis-7-and-later-versions
-f(follow) 옵션과 함께 tail 명령을 사용하여 조사할 수도 있습니다. 예를 들어 백그라운드에서 다음 명령을 실행할 수 있습니다.
tail -f some_log_file.log | grep -iq "No such file or directory"
자세한 내용은 tail 매뉴얼 페이지를 참조하십시오.
하지만 종료 상태($?)를 사용하는 것이 최선의 선택이 될 것이라고 생각합니다.
답변2
추가된 파일에 대해 차단 읽기를 수행하는 스크립트는 일반적으로 중단된 프로세스로 종료됩니다.
일반적인 읽기 및 쓰기 작업 흐름은 다음과 같습니다. 스크립트는 다음 줄이 올 때까지 기다렸다가 이를 처리하고 일부 출력을 쓴 다음 돌아와서 다음 줄을 기다립니다.
출력이 스크립트가 읽고 있는 동일한 파일로 이동하면 결국 스크립트의 읽기는 스크립트가 쓰고 있는 파일의 동일한 지점까지 따라잡습니다. 이 시점에서 스크립트는 다음 줄을 기다리지만 스크립트가 몇 줄을 쓸 때까지 줄이 나타나지 않으며 스크립트가 새 줄을 읽을 때까지 나타나지 않습니다. 스크립트가 죽었습니다.
다른 프로세스도 파일에 쓰는 경우에는 이런 일이 발생하지 않습니다. 그러나 이는 일반적으로 피해야 할 상황입니다.