오류 작업을 확인하고 자동으로 다시 제출하는 스크립트를 작성하는 방법은 무엇입니까?

오류 작업을 확인하고 자동으로 다시 제출하는 스크립트를 작성하는 방법은 무엇입니까?

저는 그리드(항상 최대 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

관련 정보