跟踪gnu parallel

时间:2016-08-16 15:12:12

标签: bash gnu-parallel

我已经在我们的一个主要脚本中实现了并行,以在服务器之间执行数据迁移。目前,输出以漂亮的颜色一次性呈现(-u),根据正在运行的序列(例如5/20: $username: rsyncing homedir5/20: $username: restoring account),正在执行的函数的状态周期性回声。这些都直接回显到运行脚本的终端,并在那里积累。但是,根据命令运行的时间长度,输出可能会无序地结束,并且在shuffle中可能会丢失长时间运行的rsync命令。但是我不想等待长时间运行的进程完成以获得后续进程的输出。

简而言之,我的问题是跟踪正在处理哪些参数并且仍在运行。

我想要做的是使用(parallel args command {#} {} ::: $userlist) &并行发送到后台,然后跟踪每个正在运行的功能的进度。我最初的想法是每隔几秒就用psgrep以及tput来重写屏幕。我通常并行运行三个作业,所以我想要一个显示的屏幕,例如:

1/20: user1: syncing homedir
current file: /home/user1/www/cache/file12589015.php

12/20: user12: syncing homedir
current file: /home/user12/mail/joe/mailfile

5/20: user5: collecting information
current file: 

我当然可以一起得到上面的状态输出没有问题,但是我当前的挂机是将各个并行进程的输出分成三个不同的......管道?变量?文件?这样它就可以解析成上面的信息。

2 个答案:

答案 0 :(得分:1)

不确定这是否更好:

echo hello im starting now
sleep 1
# start parallel and send the job to the background
temp=$(mktemp -d)
parallel --rpl '{log} $_="Working on@arg"' -j3 background {} {#} ">$temp/{1log} 2>&1;rm $temp/{1log}" ::: foo bar baz foo bar baz one two three one two three :::+ 5 6 5 3 4 6 7 2 5 4 6 2 &
while kill -0 $!  2>/dev/null ; do
    cd "$temp"
    clear
    tail -vn1 *
    sleep 1
done
rm -rf "$temp"

为每个作业创建一个日志文件。每秒对所有日志文件进行尾部处理,并在完成作业时删除日志文件。

日志文件名为'正在...'。

答案 1 :(得分:0)

我相信这很接近我所需要的,虽然它不是很整洁,可能不是最佳的:

#!/bin/bash

background() { #dummy load. $1 is text, $2 is number, $3 is position
        echo $3: starting sleep...
        sleep $2
        echo $3: $1 slept for $2
}

progress() {
        echo starting progress loop for pid $1...
        while [ -d /proc/$1 ]; do
                clear
                tput cup 0 0
                runningprocs=`ps faux | grep background | egrep -v '(parallel|grep)'`
                numprocs=`echo "$runningprocs" | wc -l`
                for each in `seq 1 ${numprocs}`; do
                        line=`echo "$runningprocs" | head -n${each} | tail -n1`
                        seq=`echo $line | rev | awk '{print $3}' | rev`
                        # print select elements from the ps output
                        echo working on `echo $line | rev | awk '{print $3, $4, $5}' | rev`
                        # print the last line of the log for that sequence number
                        cat logfile.log | grep ^$seq\: | tail -n1
                        echo
                done
                sleep 1
        done
}

echo hello im starting now
sleep 1
export -f background
# start parallel and send the job to the background
parallel -u -j3 background {} {#} '>>' logfile.log ::: foo bar baz foo bar baz one two three one two three :::+ 5 6 5 3 4 6 7 2 5 4 6 2 &
pid=$!
progress $pid
echo finished!

我宁愿不依赖于从ps抓取所有信息而宁愿获得每个并行进程的实际行输出,但是一个人必须做一个人必须做的事情。常规输出发送到日志文件以便稍后解析。