2016-08-16 43 views
3

我已經在我們的一個主要腳本中實現了並行操作,以在服務器之間執行數據遷移。目前,輸出以漂亮的顏色一次呈現(-u),根據正在運行的序列(例如,5/20: $username: rsyncing homedir5/20: $username: restoring account),來自正在執行的功能的狀態的週期性回聲。這些都直接回應到運行腳本的終端,並在那裏積累。但是,根據命令運行的時間長短,輸出可能會出錯,長時間運行rsync命令可能在混洗中丟失。 Butm我不想等待長時間運行的進程完成以獲得以下進程的輸出。在GNU並行中跟蹤狀態/進度

總之,我的問題是跟蹤哪些參數正在處理並仍在運行。

我想要做的是發送並行到(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: 

我肯定能得到上面的狀態輸出在一起沒問題,但我目前的掛機是分離的輸出個別並行處理成三個不同的...管道?變量?文件?以便它可以被解析爲上述信息。

+0

您是否知道--linebuffer --tag和--tmux? –

+0

- 如果有人對輸出進行管道輸出以便可以定期進行分析(儘管輸出的當前輸出顯示所有參數已經整齊地格式化),但是--line-buffer和--tmux無用在這種情況下。我並不特別擔心與輸出重疊的行(這很少見),並且從tmux而不是運行過程中獲取信息似乎是額外的一步(加上我們的機器沒有默認安裝tmux) – Andrej

回答

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刮的所有信息,並希望得到每個平行過程的實際線路輸出,但一個人必須做一個人必須做的事情。定期輸出發送到日誌文件以供稍後解析。

0

不知道這是好多了:

echo hello im starting now 
sleep 1 
# start parallel and send the job to the background 
temp=$(mktemp -d) 
parallel --rpl '{log} $_="Working [email protected]"' -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" 

它使一個日誌文件爲每個作業。每秒鐘結束所有日誌文件並在作業完成時刪除日誌文件。

日誌文件名爲'working on ...'。

+0

每個進程拖尾記錄文件這是一個好主意,因爲之後可以很容易地刪除它。我想我會結合所有東西,並行使用'> $ temp/synclog。{}。log'作爲background()命令的一部分,而不是perl替換,然後用lsof和ps部分打印狀態行。 – Andrej