잘못된 작업을 확인하고 자동으로 다시 제출하는 스크립트를 어떻게 작성합니까?

잘못된 작업을 확인하고 자동으로 다시 제출하는 스크립트를 어떻게 작성합니까?

저는 그리드(항상 최대 1,500개의 작업)에서 작업을 실행하는 박사 과정 학생입니다. 일부 작업은 오류 상태가 되어 다시 제출해야 합니다. 로컬 컴퓨터의 터미널에서 오류가 발생한 작업을 보는 명령은 alien_ps -E다음과 같습니다.

   mhaque -762153733  __  EV                                   
   mhaque -762160371  __  EV                                   
   mhaque -762376874  __  EV 

.. 곧..

사용해야 하는 작업을 다시 제출하려면 alien_resubmit $jobid(노트북 터미널 창에서) 그래서 다음 쉘 명령을 사용합니다.

alien_ps -E | grep 'E' | sed 's/-//' | awk '{print "alien_resubmit " $2}' 

이것은 나에게 다음을 제공합니다:

alien_resubmit 762153733
alien_resubmit 762160371
alien_resubmit 762376874

.. 곧..

그런 다음 이 출력을 터미널에 복사하여 붙여넣고 모든 오류 작업을 다시 제출했습니다. 실제 문제는 다음과 같습니다. 작업이 언제 오류 상태에 들어갈지 알 수 없습니다. 따라서 수동으로 노트북에 로그인하여 오류 상태가 되는 작업이 있는지 확인한 후 다시 제출해야 합니다(24시간 이내에 그렇지 않으면 그리드가 작업을 종료합니다). 그래서 저는 testmyjob.sh이 명령을 5분 간격으로 반복하는 간단한 쉘 스크립트를 작성하고 싶습니다 .

alien_ps -E | grep 'E' | sed 's/-//' | awk '{print $2}'

가 있는지 확인하세요 jobid. 오류가 있는 작업이 없으면 5분 후에 다시 확인합니다(그리고 특정 횟수 동안 계속 실행됩니다(예: 셸을 실행한 후 200번). 오류가 발견되면 jobid다음 명령이 실행됩니다.

alien_resubmit jobid         (..for all error jobs..).

오류 작업이 제출되면 5분마다 다시 오류 작업 확인을 재개합니다.

그래서 ./testmyjob.sh랩톱/데스크톱 터미널에서 실행하면 백그라운드에서 계속 작동하므로 직접 확인할 필요가 없습니다. 저는 쉘 스크립팅에 능숙하지 않습니다. 따라서 이 작업을 수행하기 위한 간단한 쉘 스크립트를 작성하는 데 도움을 주십시오. 정확하게 말하면 이것은 블록 다이어그램입니다. (내 쉘 지식을 용서해주십시오)

try = 0
while(try<200) do
jobid=alien_ps -E | grep 'E' | sed 's/-//' | awk '{print $2}'
if(jobid is nonzero) 
alien_resubmit jobid   
wait_for_5min
try+ = 1;
end do

오류 상태의 작업은 항상 여러 개 있고(제가 제공한 예 참조) 작업을 변수에 할당하거나 배열을 생성하는 방법을 모르겠습니다. 스크립트에 대한 도움을 주시면 대단히 감사하겠습니다.

답변1

이 스크립트를 다음 위치에 저장할 수 있습니다./usr/local/bin/resubmit_jobs

#!/bin/bash
for job in $(alien_ps -E | grep 'E' | awk '{print $2}' | sed 's/-//'); do
  alien_resubmit $job
done

그런 다음 다음을 실행하여 스크립트를 실행 가능하게 만들어야 합니다.

chmod a+x /usr/local/bin/resubmit_jobs

그런 다음 crontab에 항목을 추가하십시오. 그냥 입력 crontab -e하고 다음 줄을 추가하세요.

[email protected] # so you'll get the output of your cron jobs by mail
*/5 * * * * /usr/local/bin/resubmit_jobs # this add a cron jobs that will run your resubmit_jobs script every 5 minutes

이 스크립트를 수동으로 실행하려면 다음을 수행하면 됩니다.resubmit_jobs

답변2

iterations=200
while [[ $iterations -gt 1 ]]; do
    for job in $(alien_ps -E | grep 'E' | awk '{print $2}' | sed 's/-//'); do
        alien_resubmit $job
    done
    sleep 300
    iterations=$(($iterations-1))
done

관련 정보