2010-05-07 8 views
17

Tôi có một kịch bản shell C mà không một cái gì đó như thế này:Cách sử dụng thực thi song song trong tập lệnh shell?

#!/bin/csh 
gcc example.c -o ex 
gcc combine.c -o combine 
ex file1 r1  <-- 1 
ex file2 r2  <-- 2 
ex file3 r3  <-- 3 
#... many more like the above 
combine r1 r2 r3 final 
\rm r1 r2 r3 

Có một số cách tôi có thể làm cho dòng 1, 23 chạy trong song song thay vì một sau khi khác?

Trả lời

13

Chuyển đổi tệp này thành tệp Makefile có phụ thuộc phù hợp. Sau đó, bạn có thể sử dụng make -j để làm cho Chạy mọi thứ có thể song song.

Lưu ý rằng tất cả các thụt lề trong một Makefile phải là TAB. TAB hiển thị Thực hiện nơi các lệnh để chạy.

Cũng lưu ý rằng Makefile này hiện đang sử dụng các tiện ích mở rộng GNU Make (các ký tự đại diện và hàm phụ).

Nó có thể trông như thế này:

export PATH := .:${PATH} 

FILES=$(wildcard file*) 
RFILES=$(subst file,r,${FILES}) 

final: combine ${RFILES} 
    combine ${RFILES} final 
    rm ${RFILES} 

ex: example.c 

combine: combine.c 

r%: file% ex 
    ex $< [email protected] 
+0

Kết hợp '-l' của bạn phải là' -o kết hợp' – SiegeX

+0

Bạn có đặt quy tắc 'cuối cùng 'trước để làm cho nó trở thành mặc định? –

+0

Tôi đang nghĩ gì? Đã sửa. –

7

Trong bash tôi sẽ làm;

ex file1 r1 & 
ex file2 r2 & 
ex file3 r3 & 
wait 
... continue with script... 

và sinh ra chúng để chạy song song. Bạn có thể check out this SO thread để biết ví dụ khác.

4
#!/bin/bash 

gcc example.c -o ex 
gcc combine.c -o combine 

# Call 'ex' 3 times in "parallel" 
for i in {1..3}; do 
    ex file${i} r${i} & 
done 

#Wait for all background processes to finish 
wait 

# Combine & remove 
combine r1 r2 r3 final 
rm r1 r2 r3 

tôi một chút thay đổi mã để sử dụng cú đúp mở rộng {1..3} chứ không phải cứng mã số kể từ khi tôi chỉ nhận ra bạn nói có rất nhiều file hơn mở rộng chỉ 3. Brace làm cho nhân rộng đến các số lớn hơn không đáng kể bằng cách thay thế ' 3 'bên trong niềng răng để bất cứ số nào bạn cần.

1

bạn có thể sử dụng cmd & và chờ sau

 
#!/bin/csh 
echo start 
sleep 1 & 
sleep 1 & 
sleep 1 & 
wait 
echo ok 

kiểm tra:

 
$ time ./csh.sh 
start 
[1] 11535 
[2] 11536 
[3] 11537 
[3] Done     sleep 1 
[2] - Done     sleep 1 
[1] + Done     sleep 1 
ok 

real 0m1.008s 
user 0m0.004s 
sys 0m0.008s 
0

GNU Parallel sẽ làm cho nó khá như:

seq 1 3 | parallel ex file{} r{} 

Tùy thuộc vào cách 'cũ công việc 'và' kết hợp 'bạn thậm chí có thể làm:

seq 1 3 | parallel ex file{} | combine 

Tìm hiểu thêm về GNU Parallel bằng cách quan sát http://www.youtube.com/watch?v=LlXDtd_pRaY

1

Bạn có thể sử dụng nohup ví dụ:

nohup ex file1 r1 &  
nohup ex file2 r2 & 
nohup ex file3 r3 & 
0

xargs có thể làm điều đó:

seq 1 3 | xargs -n 1 -P 0 -I % ex file% r%

-n 1 là dành cho "một dòng cho mỗi đầu vào", -P là dành cho "chạy từng dòng song song"