grep qstat输出和复制文件一旦完成

问题描述:

我在我的群集上使用PBS作业调度程序。在bash,我想监视作业状态,一旦工作完成,我想复制结果到 特定位置(/数据/ MyFolder中/)grep qstat输出和复制文件一旦完成

我qstat命令输出如下:

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

在此先感谢

有一个脚本here这样做(对于SGE)。我开始仅为您摘录相关部分,但您可能更容易从完整脚本开始,只需在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。

你可以随便找" C "使用grep,但你也可以只使用-o [hostname:]path流式传输至最终目的地,只要你有你的SSH密钥从节点为您的POSIX帐户。

如果你最终做了grep,你应该是一个好公民,并且每分钟限制一次或两次检查频率,以免影响服务器垃圾邮件,从而影响性能。