Làm thế nào để chạy các script song song trên một máy từ xa?


16

Tôi có thể ssh vào một máy từ xa có 64 lõi. Hãy nói rằng tôi cần chạy 640 tập lệnh shell song song trên máy này. Làm thế nào để tôi làm điều này?

Tôi có thể thấy việc chia 640 tập lệnh thành 64 nhóm trong số 10 tập lệnh. Làm thế nào sau đó tôi sẽ chạy song song từng nhóm này , tức là một nhóm trên mỗi một trong số các lõi có sẵn.

Một kịch bản của mẫu

    ./script_A &
    ./script_B &
    ./script_C &
    ...

nơi script_Atương ứng với nhóm script_Bthứ nhất, nhóm thứ hai, vv, đủ?

Các tập lệnh trong một nhóm chạy trên một lõi có thể chạy tuần tự, nhưng tôi muốn các nhóm chạy song song trên tất cả các lõi.


Nó không được đảm bảo chúng được phân phối đều bởi các lõi. Có một cái nhìn vào chủ đề này. stackoverflow.com/questions/13533146/ cường
Rui F Ribeiro

Câu trả lời:


24

Điều này trông giống như một công việc cho gnu song song:

parallel bash -c ::: script_*

Ưu điểm là bạn không phải nhóm các tập lệnh của mình theo lõi, parallelsẽ làm điều đó cho bạn.

Tất nhiên, nếu bạn không muốn trông trẻ phiên SSH trong khi các tập lệnh đang chạy, bạn nên sử dụng nohuphoặcscreen


Đó là một câu trả lời tốt và tôi chấp nhận nó như trong trường hợp chung, nó sẽ hoạt động tốt. Thật không may cho cá nhân tôi, tôi không có quyền quản trị viên cho máy từ xa và vì vậy không thể cài đặt parallelgói. Cảm ơn`
Tom

10
Bạn không phải cài đặt song song trên toàn cầu: bạn sẽ có thể chạy một bản sao từ thư mục chính của mình.
dhag

bash -ccó thể không cần thiết : parallel ::: ./script*. Với tập lệnh 640, có khả năng chúng rất giống nhau (ví dụ: chỉ có một đối số là khác nhau). Vì vậy, hãy cân nhắc sử dụng GNU Parallel trực tiếp để đặt các đối số này và sử dụng một tập lệnh.
Ole Tange

Làm cách nào để cài đặt song song gnu trên máy từ xa?
Tom

@Tom Điều gì được thay đổi bởi thực tế là bạn đang sử dụng máy từ xa? Chỉ cần lấy đúng gói từ gnu.org/software/pool và cài đặt.
Dmitry Grigoryev

5

Điều đó sẽ hoạt động miễn là bạn không cần phải theo dõi đầu ra và bạn vẫn ổn để phiên ssh của bạn mở miễn là các tập lệnh sẽ chạy. Nếu một trong những điều đó không đúng, tôi sẽ khuyên bạn nên sử dụng screenvới nhiều tab. Bạn có thể làm một cái gì đó như

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

Theo dõi các kết quả đầu ra mà tôi không quan tâm - Tôi sẽ không muốn mở phiên ssh. Còn việc sử dụng nohup thì sao? Điều này sẽ ngăn các tập lệnh dừng lại nếu phiên kết thúc không? Tôi cũng sẽ xem xét đề nghị màn hình của bạn. Cảm ơn!'
Tom

nohupcó thể sẽ hoạt động, tôi chỉ quen thuộc hơn screenvà nó có nhiều chức năng hơn có thể có hoặc không hữu ích với bạn.
David King

2

Để khởi động và quản lý số lượng lớn các công việc tạo kịch bản, bạn sẽ cần một số loại phần mềm quản lý để kiểm soát việc sử dụng tài nguyên (CPU, bộ nhớ, mức độ ưu tiên), xem trạng thái công việc (chờ, tạm dừng, chạy, kết thúc).

Công cụ lưới được xây dựng cho điều đó, ví dụ, Sun Grid Engine ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) hoặc Trình lập lịch biểu lưới mở ( http://gridscheduler.sourceforge.net/ ). Bạn cần quản trị viên cài đặt phần mềm phù hợp cho bạn trước khi bạn có thể bắt đầu. Quản trị viên có thể vui vẻ làm điều đó, thay vì nhìn thấy hàng trăm quy trình đang chạy trên máy và không có quyền kiểm soát chúng.

Nói chung, quản trị viên xác định số lượng máy có thể được chia thành bao nhiêu và bạn gửi công việc cho hàng đợi và chỉ định số lượng công việc muốn tiêu thụ, công cụ lưới sẽ giám sát việc sử dụng toàn bộ hệ thống và chạy công việc theo chính sách xếp hàng được xác định bởi quản trị viên. ví dụ: không quá x công việc có thể chạy cùng một lúc, v.v ... phần còn lại của công việc sẽ được xếp hàng trong trạng thái chờ và được giải phóng sau khi các công việc trước đó kết thúc.



0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.