【问题标题】:Add a progress bar for commands running in parallel in shell script and track the exit_code为 shell 脚本中并行运行的命令添加进度条并跟踪 exit_code
【发布时间】:2017-08-22 01:01:30
【问题描述】:

我正在使用一个脚本来运行多个 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

【问题讨论】:

  • 您似乎有 3 个并行进程写入同一个日志文件。这不会奏效。
  • 我同意我可以修改某些内容以写入 3 个日志文件。脚本并行运行时如何跟踪进度的挑战?

标签: python bash shell parallel-processing


【解决方案1】:

不要尝试在最后打印所有进程的状态,而是为每个进程执行此操作

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)  &

【讨论】:

    【解决方案2】:

    不能 100% 确定您要对所有这些 sleep 和 pid 做些什么,但我认为 GNU Parallel 可以非常简单明了地做任何事情。

    本质上,我认为您的脚本相当于:

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

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

    您可以在parallel 之后添加带有--bar--eta 的进度条。

    您可以通过在manpages 中查找--halt--resume-failed--retry-failed 来处理失败和重试。

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

    【讨论】:

    • 谢谢马克...我同意 GNU 只是想知道有没有其他方法可以达到同样的效果?任何替代品。我只是想并行运行几个脚本并记录它们的进度状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多