我已经在我们的一个主要脚本中实现了并行,以在服务器之间执行数据迁移。目前,输出以漂亮的颜色一次性呈现(-u),根据正在运行的序列(例如5/20: $username: rsyncing homedir
或5/20: $username: restoring account
),正在执行的函数的状态周期性回声。这些都直接回显到运行脚本的终端,并在那里积累。但是,根据命令运行的时间长度,输出可能会无序地结束,并且在shuffle中可能会丢失长时间运行的rsync
命令。但是我不想等待长时间运行的进程完成以获得后续进程的输出。
简而言之,我的问题是跟踪正在处理哪些参数并且仍在运行。
我想要做的是使用(parallel args command {#} {} ::: $userlist) &
并行发送到后台,然后跟踪每个正在运行的功能的进度。我最初的想法是每隔几秒就用ps
和grep
以及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:
我当然可以一起得到上面的状态输出没有问题,但是我当前的挂机是将各个并行进程的输出分成三个不同的......管道?变量?文件?这样它就可以解析成上面的信息。
答案 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
抓取所有信息而宁愿获得每个并行进程的实际行输出,但是一个人必须做一个人必须做的事情。常规输出发送到日志文件以便稍后解析。