scp와 새 파일 확인 사이에 지연이 발생할 수 있습니까?

scp와 새 파일 확인 사이에 지연이 발생할 수 있습니까?

주기적으로 물건을 다운로드하는 cronjob을 만드세요.

if ! su scpuser -c "scp ..." > /dev/null 2>&1 || ! [ -f $scptarget ]; then;
  error "did not download stuff"

$scptarget콘텐츠가 다운로드되는 곳이며 실행 중인 스크립트와 다른 볼륨에 있습니다(그러나 상태는 다르지 않고 동일한 하드 드라이브인 것 같습니다).

문제가 발생할 때마다 들어가서 살펴보니 파일이 바로 거기에 있었습니다. 조금 긴장을 풀면 파일이 존재하는지 확인하는 부분이 성공할 수도 있을까요? 아니면 SCP가 성공하더라도 오류가 발생합니까?

(원래 이 글을 쓴 사람이 실제 오류가 무엇인지 문서화할 수 있었으면 좋겠습니다. 저는 단지 지푸라기라도 잡고 있는 것뿐입니다.)

그렇다면 이 스크립트에 임의의 내용을 추가하고 싶지 않습니다 sleep. 실제 bash 프로그래머가 수행하는 더 고전적인 작업이 있습니까?

답변1

strace파일 로 scp하나 만들어 봤습니다 . scp그런 임시 파일명을 사용 하지 않고 wget실제로 대상 파일이 있는지 확인해서 실제로 쓸 데이터가 O_WRONLY|O_CREAT있으면 scp대상 파일이 존재해야 하는 것 같아요 .

대상 파일의 존재와 그 존재 확인 사이에는 "경합"이 있을 수 없습니다. 쉘은 scp종료 상태를 얻고 상태가 0이 아닌지 확인하기 위해 종료 시 SIGCHLD를 얻어야 합니다. 나는 프로세스가 종료될 때 커널이 기존 파일 이름을 처리한다고 확신합니다 scp. 파일 생성은 원자적으로 이루어져야 합니다. 굳이 추가하지 마세요 sleep. 도움이 되지 않습니다.

샘플 코드가 대상 파일 존재 테스트( [ -f $scptarget ]) 에 도달하는 유일한 방법은 scp0(영) 상태로 종료하는 것입니다. 물론 파일이 존재할 수도 있지만 오류 조건이 있습니다. $scptarget오류가 발생하면 파일의 정확성과 완전성을 확인합니까? 불완전하거나 손상된 파일을 얻을 수 있습니다.

무슨 일이 일어나고 있는지 파악하려면 2개의 if구성을 사용해야 한다고 생각합니다. 첫 번째는 종료 상태에 대한 scp것이고 두 번째는 대상 파일의 존재에 대한 것입니다. 메시지가 다른지 확인하고 프로세스 $?의 종료 상태를 기록하십시오 scp.

답변2

먼저 오류 코드를 얻습니다(stderr도 유용할 수 있습니다. 오류를 기록하지 않는 스크립트를 만드는 사람은 누구입니까...?). 'su' 또는 'scp'는 retVal>0을 반환할 수 있습니다.

OSX용 SCP 소스 코드 조각:

 // I'd put my bet for this case..
 void
 lostconn(signo)
    int signo;
 {
    if (!iamremote)
        fprintf(stderr, "lost connection\n");
    exit(1);
 }

실패 후 대상 파일이 소스 파일과 정확히 동일한지 확인하십시오.

에서 발췌맨페이지:

종료 값

성공하면 su는 실행한 명령의 종료 값을 반환합니다.

명령이 신호에 의해 종료되면 su는 신호 번호에 128을 더한 값을 반환합니다.

su가 명령을 종료해야 하는 경우(종료 요청을 받았지만 명령이 시간 내에 종료되지 않았기 때문에) su는 255를 반환합니다.

다시 말하지만..종료 코드나 표준 오류 내용이 없으면 계속 추측하는 것 외에는 할 수 있는 일이 많지 않습니다.

관련 정보