Tôi đã thực hiện điều này trong một số trường hợp và thường chỉ cuộn kịch bản của riêng tôi để thực hiện công việc với kiểm soát công việc. Nhìn chung, nếu bạn có tên của tất cả các tập lệnh bạn muốn chạy trong một tệp, giải pháp sẽ trông như sau:
#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
NUM=$((NUM+1))
ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
if [ $NUM -ge $MAX_PROCS ];then
echo "Waiting for $NUM processes to finish."
wait
NUM=0
fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit
Đó là sức mạnh vũ phu, nhưng hiệu quả. Ngoài ra, bạn không cần bất kỳ phần mềm bổ sung nào như song song được thêm vào hệ thống của bạn.
Một vấn đề lớn là lệnh chờ sẽ chờ tập lệnh chậm nhất kết thúc, có thể lãng phí thời gian. Tôi đã tạo các kịch bản để xử lý tình huống này, nhưng chúng phức tạp hơn bạn có thể tưởng tượng. Nếu tất cả các tập lệnh của bạn chạy trong cùng một khoảng thời gian, thì tập lệnh này hoạt động tốt.
Một vấn đề khác là bạn có thể phải điều chỉnh MAX_PROCS để xác định hiệu suất tốt nhất.
Tất nhiên, số lượng kết nối ssh có thể khó sử dụng. Trong trường hợp đó, chỉ cần di chuyển tập lệnh này đến máy chủ từ xa và thay đổi dòng "ssh ..." để chỉ chạy tập lệnh trực tiếp.