2013-03-26 37 views
46

Tôi có tập lệnh bash chứa các tập lệnh khác bên trong được chạy theo chuỗi. Tuy nhiên, phải mất khá nhiều thời gian để chạy hết. Có cách nào để chạy các tập lệnh này song song để cải thiện hiệu suất tổng thể không? Chúng độc lập với nhau.Chạy một số tập lệnh trong tập lệnh bash song song

Nó trông giống như:

#!/bin/bash 

#some code here 
cppcheck.sh 
churn.sh 
run.sh 

Cập nhật:

**git log --pretty=format: --numstat | perl -ane'$c{$F[2]} += abs($F[0]+$F[1]) 
if $F[2];END {print "$_\t$c{$_}\n" for sort keys %c}' > ${OUTPUT_DIR}/churn.txt** 
sed -i -e '/deps/d;/build/d;/translations/d;/tests/d' -e 30q ${OUTPUT_DIR}/churn.txt 
sort -r -n -t$'\t' -k2 ${OUTPUT_DIR}/churn.txt -o ${OUTPUT_DIR}/churn.txt 
echo "set term canvas size 1200, 800; set output '${OUTPUT_DIR}/output.html'; 
unset key; set bmargin at screen 0.4; set xtics rotate by -90 scale 0,0; 
set ylabel 'Number of lines changed (total)'; set title 'Files with high churn 
level';set boxwidth 0.7; set style fill solid; set noborder; 
plot '${OUTPUT_DIR}/churn.txt' using 2:xticlabels(1) with boxes" | gnuplot 
echo "finished running churn.sh!" 

Đây là mã bên churn.sh. Lệnh in đậm mất 40 giây để thực hiện. Nếu trong một kịch bản chính tôi đặt ampersand sau khi churn.sh &, nó ném một lỗi nói sed không thể đọc tập tin churn.txt (vì nó chưa được tạo ra). Có vẻ như nó không chờ đợi cho đến khi đầu ra được lưu trong một tập tin. Tôi chèn chờ đợi sau khi lệnh đó nhưng nó không giúp đỡ.

Trả lời

91

Sử dụng & để chạy nó trong nền sẽ làm các trick

cppcheck.sh & 
churn.sh & 
run.sh & 

wait 
echo "All 3 complete" 

Nó sẽ ngã ba ra một quy trình mới cho mỗi người trong số họ.

Bash wait cũng sẽ hữu ích như được nêu trong nhận xét, nếu bạn có thứ gì đó để chạy trên tập lệnh gốc, sau ba kết thúc này.

Không có đối số, nó sẽ chờ tất cả các tiến trình con hoàn thành, sau đó tiếp tục thực thi tập lệnh gốc.


Các vấn đề bạn đang đối mặt dường như có liên quan trực tiếp đến vấn đề này. Tập hợp biến chỉ hiển thị với sub-shell in which they are defined. Vì vậy, nếu bạn có OUT_DIR được chỉ định trong tập lệnh gốc, tập lệnh đó sẽ không hiển thị cho tập lệnh con khi nó tắt. Điều đúng đắn cần làm trong trường hợp này là export biến là biến môi trường.

+15

Ngoài ra, cuộc gọi đến 'chờ' sẽ đảm bảo tập lệnh gốc không thoát cho đến khi tất cả công việc nền đã hoàn thành –

+0

@DarkCthulhu Tôi đã sử dụng điều đó. Vấn đề là như sau. Một dòng nhận dữ liệu từ git bằng cách sử dụng --numstat và xuất nó vào một số tệp. Tệp đó sau đó được sử dụng trong dòng tiếp theo, nhưng vì lệnh & bắt đầu thực hiện dòng và bỏ qua dòng tiếp theo, dòng sau ném một lỗi nói rằng 'tệp không tồn tại', vì phải mất một lúc để lấy dữ liệu và lưu nó vào một tập tin txt. Nó gần như là vấn đề tương tự trong tất cả các tập tin kịch bản. – Bdar

+1

@Bdar Bạn vừa nói các tập lệnh độc lập với nhau. Nếu bạn muốn thêm một chút thời gian giữa các lần thực thi, bạn có thể thử 'sleep n && churn.sh &'. Khác, bạn nên thực hiện chúng theo thứ tự. –

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