2010-05-19 2 views
1

백그라운드에서 ANT 작업을 실행하고 있고 해당 작업의 완료 여부를 60 초 간격으로 확인하고 있습니다. 그렇지 않은 경우 60 초마다 메시지가 화면에 표시되어야합니다. "배포 프로세스가 아직 실행 중입니다. $ slept seconds from deploy started", 여기서 $ slept는 60, 120, 180 n입니다.쉘 스크립트 작업 상태 모니터링

한계는 1200 초입니다. 그 후 스크립트는 'ant log'명령을 통해 로그를 표시하고 계속할지 묻습니다. 사용자가 계속 선택하면 시간 제한에 300 초가 추가되고 프로세스가 반복됩니다. 나는이 작업을 위해 사용하고

코드는 -

ant deploy & 

limit=1200 
deploy_check() 
{ 
while [ ${slept:-0} -le $limit ]; do 
    sleep 60 && slept=`expr ${slept:-0} + 60` 
    if [ $$ = "`ps -o ppid= -p $!`" ]; then 
     echo "Deploy process is still running. $slept seconds since deploy started." 
    else 
     wait $! && echo "Application ${New_App_Name} deployed successfully" || echo "Deployment of ${New_App_Name} failed" 
     break 
    fi 
done 
} 

deploy_check 

if [ $$ = "`ps -o ppid= -p $!`" ]; then 
    echo "Deploy process did not finish in $slept seconds. Here's the log." 
    ant log 
    echo "Do you want to kill the process? Press Ctrl+C to kill. Press Enter to continue." 
    read log 
limit=`expr ${limit} + 300` 
    deploy_check 
fi 

이제 문제는 -이 코드는 작동하지 않습니다. 이 코드는 완벽하게 좋은 코드처럼 보이지만 아직 작동하지 않습니다. 누구든지이 코드가 잘못된 점을 지적 해 줄 수 있습니까?

+0

어떻게 작동하지 않는지 구체적으로 설명해 주실 수 있습니까? –

+0

그는 이전 질문 인 http://stackoverflow.com/questions/2810757/how-to-do-parrallel-processing-in-unix-shell-script/2812763#2812763의 의견에 항상 그가 "아직 실행 중"이라는 메시지. – pra

+0

@pra : 포인터 주셔서 감사합니다.OP가이 질문에이 정보를 전달 했어야합니다. –

답변

1

사용자가 계속 선택하면 deploy_check이 다시 실행되지만 사용자가 계속하거나 취소 할 수있는 또 다른 기회는 없습니다 (Ctrl-C는 언제든지 누를 수 있음). 따라서 루프를 while 루프로 감쌀 수 있습니다.

또한 Ctrl-C를 누르면 하위 프로세스가 중단되지 않습니다. 예 또는 아니오를 묻는 메시지가 나타나면 예를 들어 kill $! 메시지를 보내야합니다.

편집 : 여기

당신의 코드가 어떻게 흐르는 지 :

  • 잤 때까지 통화 deploy_check
    • 루프 제한
    • 브레이크 (이것은 그 시점에서 1260 것)을 초과 성공적으로 배포 된 경우
  • 사용자가 Ctrl-C를 누르면 스크립트가 종료되지만 ant deploy은 실행 상태입니다 (Ctrl-C를 처리하는 스크립트의 다른 위치에 트랩이 설정되어 있지 않은 경우) kill 잠까지 사용자가 Enter 키를 누를 경우 ant deploy 과정)
  • 에 한계가 1500
  • 전화 deploy_check 테스트로 상승은 한계 (가 1,560 될 것입니다 제한 == 1500
    • 루프에 대해 == 1260을 초과자는 그 시점에서)
    • 다시

    당신이 다시 발생하도록 프롬프트를 일으킬 루프를 필요 사용자에게 메시지를 표시하지 않고 성공적으로

  • 스크립트 (또는 그것의이 섹션) 종료 배치하면 휴식.

  • +0

    또한 질문에있는 코드가 스크립트에있는 다른 코드와 어떤 관련이 있는지에 따라'slept'를 0으로 초기화 (또는 설정 해제)해야 할 수도 있습니다. –

    +0

    첫 번째 사용을 계속 한 후 제한을 300 초 늘립니다. 300 초가 지난 후에도 그는 같은 옵션을 다시 사용하여 계속하거나 죽일 것입니다. limit 및 slept 변수는 주어진 코드에서만 사용되며 스크립트의 다른 곳에서는 사용되지 않습니다. 내가 당황한 이유는 코드가 때때로 작동하고 때로는 작동하지 않는다는 사실입니다. 느슨한 연결과 같습니다. : –

    +0

    @Bikram Agarwal : 코드가 작성된 방식으로 사용자에게 두 번째 메시지가 표시되지 않습니다. 코드가 변수와 관련되지 않은 방법을 언급했습니다.이 코드 주위에 루프가 있거나 deploy_check가 다른 곳에서 호출되면, 변수 값이 예상치 못한 방식으로 변경 될 수 있으며, 사용자가 두 번째로 프롬프트를 표시하지 않는 이유를 알 수 있도록 코드의 플로트 추적에 대한 내 편집 된 응답을 참조하십시오. –