2017-06-14 2 views
1

Ich verwende PBS Job Scheduler auf meinem Cluster. In bash, würde Ich mag den Jobstatus überwachen und, sobald der Job Ich mag die Ergebnisse in einen bestimmten Ort erfolgt wäre (/ data/myfolder /) siehtGrep Qstat Ausgabe und kopieren Sie die Dateien einmal fertig

Meine qstat Ausgabe wie folgt kopieren:

JobID Username Queue Jobname SessID NDS TSK Memory Time Status 
    ---------------------------------------------------------------- 
    717.XXXXXX user XXXX  SS 2323283 1 24 122gb --  E 

Vielen Dank im Voraus

Antwort

1

Es gibt ein Skript here, das dies (für SGE) tut. Ich fing an, nur die relevanten Teile für Sie zu extrahieren, aber es wird wahrscheinlich einfacher für Sie sein, mit dem vollständigen Skript zu beginnen und einfach die qsub Befehle in die submit_job-Funktion einzufügen und dann den gewünschten Code zum Kopieren der Ergebnisse nach dem wait_job_finish Befehl im Skript. Sie können den Protokolldruck am Ende entfernen, wenn Sie möchten.

#!/bin/bash 

# this script will submit a qsub job and check on host information for the cluster 
# node which it ends up running on 
# ~~~~~ CUSTOM FUNCTIONS ~~~~~ # 
submit_job() { 
    local job_name="$1" 
    qsub -j y -N "$job_name" -o :${PWD}/ -e :${PWD}/ <<E0F 
set -x 
hostname 
cat /etc/hosts 
python -c "import socket; print socket.gethostbyname(socket.gethostname())" 
# sleep 5000 
E0F 
} 

wait_job_start() { 
    local job_id="$1" 
    printf "waiting for job to start" 
    while ! qstat | grep "$job_id" | grep -Eq '[[:space:]]r[[:space:]]' 
    do 
     printf "." 
     sleep 1 
    done 
    printf "\n\n" 

    local node_name="$(get_node_name "$job_id")" 
    printf "Job is running on node $node_name \n\n" 
} 

wait_job_finish() { 
    local job_id="$1" 
    printf "waiting for job to finish" 
    while qstat | grep -q "$job_id" 
    do 
     printf "." 
     sleep 1 
    done 
    printf "\n\n" 
} 

check_for_job_submission() { 
    local job_id="$1" 
    if ! qstat | grep -q "$job_id" ; then 
     echo "its there" 
    else 
     echo "not there" 
    fi 
} 

get_node_name() { 
    local job_id="$1" 
    qstat | grep "$job_id" | sed -e 's|^.*[[:space:]]\([a-zA-Z0-9.]*@[^ ]*\).*$|\1|g' 
} 
# ~~~~~ RUN ~~~~~ # 
printf "Submitting cluster job to get node hostname and IP\n\n" 

job_name="get_node_hostnames" 
job_id="$(submit_job "$job_name")" # Your job 832606 ("get_node_hostnames") has been submitted 
job_id="$(echo "$job_id" | sed -e 's|.*[[:space:]]\([[:digit:]]*\)[[:space:]].*|\1|g')" 
job_stdout_log="${job_name}.o${job_id}" 

printf "Job ID:\t%s\nJob Name:\t%s\n\n" "$job_id" "$job_name" 

wait_job_start "$job_id" 
wait_job_finish "$job_id" 

printf "\n\nReading log file ${job_stdout_log}\n\n" 
[ -f "$job_stdout_log" ] && cat "$job_stdout_log" 
printf "\n\nRemoving log file ${job_stdout_log}\n\n" 
[ -f "$job_stdout_log" ] && rm -f "$job_stdout_log" 

Nebenbei bemerkt: Wenn Sie wie Python, eine etwas robustere entspricht here

Sie werden wahrscheinlich einige kleine Verbesserungen sowohl für Ihr PBS-System einstellen müssen, um tun, da dies geschrieben wurde für SGE.

1

Sie können für " C " mit grep suchen einfach, aber man könnte auch -o [hostname:]path nur bis zum Zielort streamen verwenden, solange Sie Ihre sSH-Schlüssel haben von dem Knoten für Ihre POSIX einrichten Konto.

Wenn Sie grep beenden, sollten Sie ein guter Bürger sein und Ihre Prüfhäufigkeit ein- oder zweimal pro Minute begrenzen, um nicht zu Server-Spam beizutragen, der die Leistung beeinträchtigen kann.