2010-07-23 53 views
11

Tôi đang cố gắng sử dụng xargs trong một kịch bản lệnh shell để chạy các thể hiện song song của một hàm tôi đã định nghĩa trong cùng một tập lệnh. Hàm này tính thời gian tìm nạp một trang và do đó, điều quan trọng là các trang thực sự được tìm nạp đồng thời trong các quy trình song song và không phải trong các quy trình nền (nếu sự hiểu biết của tôi về điều này là sai và có sự khác biệt không đáng kể giữa hai trang, hãy cho tôi biết) .Shell Scripting: Sử dụng xargs để thực thi các trường hợp song song của hàm shell

Chức năng là:

function time_a_url() 
{ 
    oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2) 
    echo "Fetching $1 took $oneurltime seconds." 
} 

Làm sao người ta làm điều này với một ống xargs trong một hình thức có thể mất số lần chạy time_a_url song song như một cuộc tranh cãi? Và có, tôi biết về GNU song song, tôi chỉ không có đặc quyền để cài đặt phần mềm mà tôi đang viết này.

Trả lời

11

Dưới đây là một bản demo về cách bạn có thể có thể để có được chức năng của bạn để làm việc:

$ f() { echo "[[email protected]]"; } 
$ export -f f 
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\} 
[b 1] 
[d 3 4] 
[c 2] 

Chìa khóa để làm công việc này là để export chức năng nên bash rằng xargs bầy sẽ thấy nó và để thoát khỏi khoảng cách giữa tên hàm và dấu ngoặc đã thoát. Bạn sẽ có thể thích ứng với điều này để làm việc trong tình huống của bạn. Bạn sẽ cần phải điều chỉnh các đối số cho -P-n (hoặc xóa chúng) cho phù hợp với nhu cầu của bạn.

Bạn có thể xóa số grepcut. Nếu bạn đang sử dụng hàm dựng sẵn Bash time, bạn có thể chỉ định định dạng đầu ra bằng biến số TIMEFORMAT. Nếu bạn đang sử dụng GNU /usr/bin/time, bạn có thể sử dụng đối số --format. Một trong hai cách này cũng sẽ cho phép bạn thả số -p.

Bạn có thể thay thế phần này của lệnh wget: 2>&1 1>/dev/null bằng -q. Trong mọi trường hợp, bạn có những người bị đảo ngược. Thứ tự đúng sẽ là >/dev/null 2>&1.

+1

Tôi đã sử dụng 'xargs -P0 -n1 -I {} bash -c" f {} "' vẫn hoạt động và có vẻ như tidier nhỏ hơn. –

0

Nếu bạn cài đặt GNU Parallel trên một hệ thống khác, bạn sẽ thấy chức năng nằm trong một tệp duy nhất (được gọi là song song).

Bạn có thể chỉ cần sao chép tệp đó vào ~/bin của riêng bạn.

1

Trên Mac OS X:

xargs: max. quy trình phải> 0 (cho: xargs-P [> 0])

f() { echo "[[email protected]]"; } 
export -f f 

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\} 

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "[email protected]"' arg0 '{}' 
Các vấn đề liên quan