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 đỡ.
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 –
@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
@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ự. –