2012-07-14 45 views
11

Tôi có một tệp chứa các dòng lệnh mà tôi muốn chạy. Tệp này chứa khoảng 2.000 dòng.Làm thế nào tôi có thể chạy một danh sách các lệnh song song?

Tôi có 8 lõi có sẵn. Có thể phân tích cú pháp tệp và bắt đầu 8 quy trình, sau đó thực hiện một quy trình khác từ tệp bất kỳ khi nào một trong các chương trình kết thúc không? Tôi muốn điều này tiếp tục cho đến khi kết thúc tệp.

+0

Vui lòng xem [Process Management] (http://mywiki.wooledge.org/ProcessManagement). –

Trả lời

18

Bạn có thể sử dụng xargs để đọc trong tệp, đồng thời giới hạn số lượng quy trình tối đa đối với số lõi khả dụng. Ví dụ:

cores=$(fgrep -c processor /proc/cpuinfo) 
xargs --arg-file=/tmp/foo \ 
     --max-procs=$cores \ 
     --replace \ 
     --verbose \ 
     /bin/sh -c "{}" 
+1

tốt nhất giải pháp –

0

Bạn có thể bắt đầu quá trình mới trên nền đơn giản bằng cách chạy lệnh với &. Có một ví dụ here mô tả một giải pháp cho vấn đề của bạn.

28

Sử dụng GNU parallel. Đó là một công cụ cực kỳ mạnh mẽ và các gói chính thức tồn tại trong khoảng 20 hoặc hơn các bản phân phối Linux. Cái gì thế? You have an excuse as to why you can't use it? Dưới đây là một ví dụ đơn giản cho thấy làm thế nào để chạy một danh sách hoặc tập tin của lệnh song song:

Nội dung jobs.txt:

sleep 1; echo "a" 
sleep 3; echo "b" 
sleep 2; echo "c" 

Command:

time parallel :::: jobs.txt 

Kết quả:

a 
c 
b 

real 0m3.332s 
user 0m0.170s 
sys  0m0.037s 

Ghi chú:

Nếu bạn muốn giữ lại thứ tự giống như đầu vào, hãy chuyển cờ -k sang GNU song song.

Nếu bạn có nhiều hơn tám lõi và chỉ muốn xử lý với tám lõi, hãy thêm -j 8 vào danh sách args.

man page là đọc tốt, nhưng nếu bạn chưa đọc this tutorial Tôi rất muốn giới thiệu thời gian đầu tư.

+0

GNU song song không có sẵn trên Ubuntu 11.10, nhưng nó có sẵn trên sid Debian. Nó cũng đáng chú ý là ví dụ này sẽ * không * làm việc như-là với các tiện ích song song từ gói phần mềm bổ sung, trong đó có một số ngữ nghĩa khác nhau. –

+0

-j 8 là không cần thiết - nó được tự động phát hiện. Gói Ubuntu: https://build.opensuse.org/package/binaries?package=parallel&project=home%3Atange&repository=xUbuntu_11.10 –

+0

Để chạy các lệnh từ một tệp song song, bạn có thể thực hiện 'cat/path/to/file .txt | song song' –

Các vấn đề liên quan