我使用单个脚本来运行多个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
答案 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
之后添加--eta
或parallel
的进度条。
您可以通过查看--halt
--resume-failed
和--retry-failed
以及ssh
来处理失败和重试。
您还可以在具有{{1}}访问权限的多台计算机上运行作业,并控制并行运行的数量。