2014-11-10 1 views
1


필자가 쓰는 일부 스크립트에 도움이 필요합니다.
시나리오 :스크립트 흐름에서 종료 코드 캡처

  • 스크립트 는 예약 프로세스에 의해 실행된다. 이 스크립트는 전달 된 인수를 가져 와서 어떤 식 으로든 구문 분석하고 스크립트를 실행합니다. B이 인수로 전달합니다.
  • 스크립트 B는 sudo -u 사용자 SSH 사용자 @의 REMOTEMACHINE는, (원격 시스템에) 몇 가지 명령을 실행하고 마지막으로 스크립트 C (또한 원격 시스템에서)를 실행한다. 나는 여기에 문서을 사용하여 해당 명령을 전달합니다. 또한 이전 스크립트를이 스크립트에도 전달합니다.
  • "흐름"이 올바르게 실행되고 작업이 성공적으로 완료됩니다.

내 문제는 다음과 같습니다이 "흐름"스케줄링 프로세스에 의해 실행되기 때문에 작업이 성공적 여부를 완료하면

  • , 내가 말할 필요가있다. 내가 종료 코드를 통해이 일을하고있어, 내가 원하는 것은 체인의 종료 코드이며, 오류가 발생한 경우 마지막 스크립트에서 첫 번째 스크립트로 되돌아 간다. 종료 코드는 단일 스크립트에 대해 올바르게 작동하기 때문에 수행 할 수 없습니다 (개별적으로 실행하고 종료 코드를 찾습니다). 그러나 부모 스크립트로 다시 보내지지 않습니다. 내 의견으로는 문제는 ssh가 하위 스크립트에서 종료 코드를 얻고 있다는 것입니다. 하위 스크립트에서 실제로 종료되었습니다. 실행 오류가 없기 때문에 문제가 발생했습니다. 잘못된 명령입니다.
  • 프로세스가 제대로 작동하는 동안

  • , 나는 아직도이 줄 수 :

    ssh: Could not resolve hostname : Name or service not known

을하지만 실제로 스크립트가 성공적으로 완료됩니다.

내가 작성한 내용을 이해했으면 좋겠다. 스크립트를 게시 할 수 있기를 바랍니다.

감사

O.는


편집 :
이것은 스크립트입니다. 변수 이름에 문제가있을 수 있는데, 파일 이름을 quikly로 변경했기 때문입니다. 나는 때문에 나의 낮은 평판의 3 개 파일을 업로드 할 수 있기 때문에
, 나는
SCRIPT FILE

+2

스크립트를 제공해주십시오. –

+0

각 스크립트가 오류가 발생하면 오류를 반환하면됩니다 (명령이 잘못되어도 "실행 오류가 없습니다"로 항상 0이 반환됩니다). 그러면 ";"대신 "&&"로 묶을 수 있습니다. 각 스크립트가 이전 스크립트가 성공적으로 종료되었는지 확인해야하는 경우 –

+0

@OlivierDulac 나는 당신이 말한 것을 이해하지 못합니다. 나는 && 명령을 사용하여 두 번째 스크립트의 명령을 연결하려고 시도했지만 또한 개별적으로 실행하려고 시도했지만 (kinit에 대해 하나의 ssh가 있었고 스크립트를 시작하는 다른 ssh) 문제가 남아 있습니다. – Omar

답변

1

내가 문제를 해결하기 위해 관리하는 하나의 파일에 병합.
나는 olivier의 조언을 따르고 escape char를 사용하여 원격 컴퓨터에서 변수를 확장했습니다.
또한 오류가 발생한 위치에 따라 다른 종료 코드를 구현했습니다.다음과 같이 마침내
, 나는 두 번째 스크립트는 sudo -u를 실행 한 후, 첫 번째 스크립트를 수정 :

EXITCODEOFTHESECONDSCRIPT=$?  
if [ $EXITCODEOFTHESECONDSCRIPT = 0 ] 
    then 
     echo "" 
     echo "Export job took $SECONDS seconds." 
     echo "" 
     exit 0 
else 
    exit $EXITCODEOFTHESECONDSCRIPT 
fi 

내가 두 번째 스크립트에서 제공하는 종료 코드를 유지하는 주요 스크립트를 종료 할 수 있어요 이런 식으로. 사실 문제는 프로세스가 오류가 발생해도 제대로 작동한다는 것이었지만 두 번째 스크립트가 실패한 후 echo 명령이 충분하면 더 많은 명령을 제공한다는 사실이 다른 종료 코드를 제공하여 내가 원했던 하나.

모두에게 감사드립니다!

+0

당신이 그것을 만들 줄 알았습니다 :) 일반적인 접근법은 중요한 단계의 종료 코드를 그 단계 직후에'errcode = $? '와 같이 기록한 다음 함수에서 리턴하기 위해'$ errcode'를 리턴 할 수 있습니다 또는'exit $ errcode'를 실행하여 같은 코드로 스크립트를 종료하십시오. echo/printf/etc 중요한 단계를 수행 한 후에 수행하십시오. –