Câu trả lời:
Bạn không sử dụng vòng lặp while.
parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts
Lưu ý rằng điều này sẽ không hoạt động nếu bạn có đường dẫn trong live_hosts
(ví dụ /some/dir/file
) vì nó sẽ mở rộng sang sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file
(kết quả là no such file or directory
); đối với những trường hợp sử dụng {//}
và {/}
(xem gnu-parallel
hướng dẫn để biết chi tiết):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>
bằng | tee
ví dụ lệnh đầu tiên trở thành parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
Là một người cũ "làm một việc và làm tốt" anh chàng Unix, tôi đã đặt công cụ thay thế chuỗi vào tập lệnh bao bọc:
#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"
Nếu bạn gọi nó wrapper.sh
, parallel
lệnh để gọi nó sẽ là:
parallel wrapper.sh < live_hosts
Lưu ý rằng bạn không cần cat
loại điều này, giúp lưu một lệnh gọi chương trình bên ngoài.
Bạn không cần parallel
, vì phần thân của vòng lặp không phụ thuộc vào các lần lặp trước. Chỉ cần bắt đầu một quá trình nền mới cho mỗi máy chủ.
while read host; do
sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait # Optional, to block until the background tasks are done
parallel
mặc dù làm cho nó dễ dàng hơn để quản lý các khía cạnh nhất định; bạn có thể giới hạn số lượng công việc chạy song song dễ dàng hơn.
wc -l live_hosts
nhiều hơn số lượng trục chính hoặc lõi CPU - tùy thuộc vào nhiệm vụ là I / O hay bị ràng buộc bởi CPU - bạn sẽ ăn được rất nhiều lợi thế bạn có được từ việc xử lý song song với giải pháp như vậy. Khả năng parallel
giới hạn số lượng công việc không chỉ là tốt, nó gần như là điều cần thiết, nếu tốc độ xử lý là mục tiêu của bạn.
tee
vớiparallel
khi đưa đầu ra vàosortedstuff
? Vì vậy, tôi có thể thấy đầu ra khi nó đi.