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