2017-06-14 36 views
1

を行ってファイルをコピーします。 bashで、私は仕事の状況を監視したいと思いますし、ジョブが完了したら、私は 特定の場所に結果をコピーしたいと思います(/データ/ myfolderなど/)は、grepは出力をqstatの、かつて私は、クラスタ上でPBSのジョブスケジューラを使用しています

マイqstatの出力は次のようになります。

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

おかげ

答えて

1

(SGEのため)、この処理を行うスクリプトhereがあります。私はあなたのためだけの関連する部分を抜粋し始めていますが、完全なスクリプトを開始し、ちょうどsubmit_job関数内qsubコマンドを挿入し、wait_job_finish後に結果をコピーするためにあなたがしたいコードを配置することはおそらく容易になりますコマンドを実行します。必要に応じて最後にログ印刷を削除することができます。

#!/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" 

追記:あなたは、Pythonのように、同等の少しより堅牢ながある場合here

あなたはおそらくあなたのPBSシステムのためにそれを調整するための両方にいくつかの小さな微調整を行う必要があるでしょう、これは書かれていたので、 SGEの場合

1

あなただけのgrepで" C "を探すことができますが、あなたはまた、単に限り、あなたはあなたのSSHキーはあなたのPOSIXのためのノードから設定しているとして、最終的な宛先にストリーミングする-o [hostname:]pathを使用することができますアカウント。

あなたはgrepのをやってしまう場合は、善良な市民である必要があり、パフォーマンスに影響を与えることができ、サーバのスパムに貢献しないように、一度か二度分にあなたのチェック頻度を制限します。

関連する問題