
Ich bin Doktorand und führe Jobs in einem Grid aus (~1500 Jobs gleichzeitig). Einige der Jobs gehen in den Fehlerzustand über und müssen erneut übermittelt werden. Der Befehl zum Anzeigen der fehlerhaften Jobs (von meinem lokalen Computer in einem Terminal) lautet alien_ps -E
:
mhaque -762153733 __ EV
mhaque -762160371 __ EV
mhaque -762376874 __ EV
.. bald..
Um die Aufträge erneut zu übermitteln, muss ich das alien_resubmit $jobid
(im Terminalfenster meines Laptops) verwenden. Daher verwende ich den folgenden Shell-Befehl:
alien_ps -E | grep 'E' | sed 's/-//' | awk '{print "alien_resubmit " $2}'
was mir gibt:
alien_resubmit 762153733
alien_resubmit 762160371
alien_resubmit 762376874
.. bald..
Dann kopiere ich diese Ausgabe und füge sie in mein Terminal ein, das dann alle diese fehlerhaften Jobs erneut übermittelt. Hier ist das eigentliche Problem: Ich weiß nicht, wann die Jobs in den Fehlerzustand wechseln. Ich muss mich also manuell bei meinem Laptop anmelden und prüfen, ob irgendwelche Jobs in den Fehlerzustand gewechselt sind, und sie dann erneut übermitteln (innerhalb von 24 Stunden, sonst beendet das Grid den Job). Daher möchte ich ein einfaches Shell-Skript schreiben, testmyjob.sh
das diesen Befehl in 5-Minuten-Intervallen wiederholt:
alien_ps -E | grep 'E' | sed 's/-//' | awk '{print $2}'
und sehen Sie, ob es welche gibt jobid
. Wenn kein Job fehlerhaft ist, wird die Prüfung nach 5 Minuten erneut durchgeführt (und zwar eine bestimmte Anzahl von Malen, beispielsweise 200 Mal, nachdem ich die Shell ausgeführt habe). Wenn ein Fehler gefunden wird, jobid
wird der folgende Befehl ausgeführt:
alien_resubmit jobid (..for all error jobs..).
Nach dem Senden der fehlerhaften Jobs wird die Überprüfung auf fehlerhafte Jobs im 5-Minuten-Intervall wieder aufgenommen.
Ich werde es also einfach von meinem Laptop/Desktop-Terminal aus ausführen ./testmyjob.sh
und es wird im Hintergrund weiterarbeiten, sodass ich die Überprüfung nicht selbst durchführen muss. Ich bin nicht gut im Shell-Scripting. Bitte helfen Sie mir also, ein einfaches Shell-Script zu schreiben, das diese Aufgabe erledigt. Genauer gesagt ist hier das Blockdiagramm: (entschuldigen Sie meine Shell-Kenntnisse)
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
Bitte beachten Sie, dass sich immer mehrere Jobs im Fehlerzustand befinden (siehe die Beispiele, die ich gegeben habe) und ich weiß nicht, wie Sie die Jobs einer Variablen zuweisen oder ein Array erstellen. Jede Art von Hilfe mit dem Skript wird sehr geschätzt.
Antwort1
Sie können dieses Skript speichern in/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
Anschließend sollten Sie das Skript durch Ausführen des folgenden Befehls als ausführbar festlegen:
chmod a+x /usr/local/bin/resubmit_jobs
Fügen Sie dann einen Eintrag zu Ihrer Crontab hinzu. Geben Sie einfach Folgendes ein: crontab -e
und fügen Sie diese Zeilen hinzu:
[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
Wenn Sie dieses Skript manuell ausführen möchten, müssen Sie nur Folgendes tun:resubmit_jobs
Antwort2
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