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