为shell脚本中并行运行的命令添加进度条并跟踪exit_code

时间:2017-08-21 15:42:08

标签: python bash shell parallel-processing

我使用单个脚本来运行多个python和shell脚本。 很少有人使用&并行运行。我的要求是跟踪这个并行运行任务的进度并显示它我也希望得到脚本的exit_code,如果任何脚本在执行日志期间失败,它说script-1/2/3由于x原因而失败。

我尝试使用下面的代码集。每件事都在进行串行处理,但是 对于并行处理命令,我得到最后一个执行过程Id:

#!/bin/bash
LOG_DIR_LOC=$1
export python_path='/usr/bin/python'
export log_file=${LOG_DIR_LOC}/log_parallel_exec_`date "+%d-%m-%Y_%H:%M:%S"`.log
export script1='/home/test-arg.py'
export script2='/home/parallel.py'
export script3='/home/test.sh'
pids=""
echo -ne '#....................................................................................................  (1%)\r'
sleep .5


${python_path} ${script1} a b >> ${log_file} 2>&1 &
pids+=($!)
echo -ne '#################################################....................................................  (40%)\r'
sleep .5

${python_path} ${script2} c d >> ${log_file} 2>&1 &
pids+=($!)
echo -ne '###############################################################################......................  (70%)\r'
sleep .5

sh ${script3} >> ${log_file} 2>&1 &
pids+=($!)
echo -ne '##################################################################################################.... (98%)\r'
sleep .5


wait 
if [ $? -eq 0 ]; then
    echo "SUCCESS - Job exited with a status of $?" >> ${log_file} 2>&1
else
    echo "FAILED - Job exited with a status of $?" >> ${log_file} 2>&1
fi
done
echo -ne '#####################################################################################################  (100%)\r'
sleep .5

2 个答案:

答案 0 :(得分:2)

不要尝试在最后打印所有流程的状态,而是为每个

执行此操作
print_status() {
    r=$?
    if [ $r -eq 0 ]; then
        echo "SUCCESS - Job exited with a status of $r" >> ${log_file} 2>&1
    else
        echo "FAILED - Job exited with a status of $r" >> ${log_file} 2>&1
    fi
}

(${python_path} ${script1} a b >> ${log_file} 2>&1; print_status)  &

答案 1 :(得分:1)

不是100%肯定你正在努力做的所有这些睡眠和pids,但我认为 GNU Parallel 可以做任何简单和简洁的事情。

从本质上讲,我认为你的剧本相当于:

cat << EOF | parallel --dry-run --tag
python a b
python c d
bash xyz
EOF

所以,这将是一个干运行(没有实际做任何事情,但告诉你它会做什么)并标记所有输出线,以便它们可以相互区分。三个脚本(2x Python + 1x bash)将并行运行。

您可以在--bar之后添加--etaparallel的进度条。

您可以通过查看--halt --resume-failed--retry-failed以及ssh来处理失败和重试。

您还可以在具有{{1}}访问权限的多台计算机上运行作业,并控制并行运行的数量。