วิธีการรันสคริปต์แบบขนานบนเครื่องระยะไกล


16

ฉันสามารถ ssh ลงในเครื่องระยะไกลที่มี 64 คอร์ ให้บอกว่าฉันต้องรันเชลล์สคริปต์ 640 แบบขนานบนเครื่องนี้ ฉันจะทำสิ่งนี้ได้อย่างไร

ฉันเห็นการแบ่ง 640 สคริปต์ออกเป็น 64 กลุ่มแต่ละ 10 สคริปต์ ฉันจะเรียกใช้แต่ละกลุ่มเหล่านี้แบบขนานได้อย่างไรเช่นหนึ่งกลุ่มในแต่ละแกนที่มีอยู่

จะสคริปต์ของแบบฟอร์ม

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

ที่script_Aสอดคล้องกับกลุ่มแรกscript_Bไปยังกลุ่มที่สอง ฯลฯ พอเพียง?

สคริปต์ภายในกลุ่มหนึ่งที่รันบนแกนหลักนั้นสามารถเรียกใช้ตามลำดับได้ แต่ฉันต้องการให้กลุ่มทำงานขนานกันทั่วทุกแกน


ไม่รับประกันว่าจะถูกกระจายอย่างสม่ำเสมอโดยแกนประมวลผล ดูที่หัวข้อนี้ stackoverflow.com/questions/13583146/…
Rui F Ribeiro

คำตอบ:


24

ดูเหมือนว่างานของ gnu parallel:

parallel bash -c ::: script_*

ข้อดีคือคุณไม่ต้องจัดกลุ่มสคริปต์ตามแกนparallelจะทำเพื่อคุณ

แน่นอนถ้าคุณไม่ต้องการดูแลเซสชัน SSH ในขณะที่สคริปต์กำลังทำงานอยู่คุณควรใช้nohupหรือscreen


มันเป็นคำตอบที่ดีและฉันยอมรับเช่นเดียวกับในกรณีทั่วไปมันจะทำงานได้ดีโชคไม่ดีสำหรับฉันเป็นการส่วนตัวฉันไม่มีสิทธิ์ของผู้ดูแลระบบในเครื่องระยะไกลและดังนั้นจึงไม่สามารถติดตั้งparallelแพ็คเกจได้ Thanks`
Tom

10
คุณไม่จำเป็นต้องติดตั้งแบบขนานทั่วโลก: คุณควรจะสามารถเรียกใช้สำเนาจากโฮมไดเร็กตอรี่ของคุณเองได้
dhag

bash -cparallel ::: ./script*อาจจะไม่จำเป็น: ด้วยสคริปต์ 640 รายการมีแนวโน้มว่าจะคล้ายกันมาก (เช่นมีเพียงอาร์กิวเมนต์เท่านั้นที่แตกต่างกัน) สำหรับการพิจารณาให้ใช้ GNU Parallel โดยตรงเพื่อตั้งค่าอาร์กิวเมนต์เหล่านี้และใช้สคริปต์เดียว
Ole Tange

ฉันจะติดตั้ง gnu ขนานบนเครื่องระยะไกลได้อย่างไร
Tom

@Tom ความจริงที่ว่าคุณใช้เครื่องรีโมตมีการเปลี่ยนแปลงอะไรบ้าง เพียงรับแพ็คเกจที่ถูกต้องจากgnu.org/software/parallelและติดตั้ง
Dmitry Grigoryev

5

สิ่งนี้จะทำงานได้ตราบใดที่คุณไม่จำเป็นต้องตรวจสอบผลลัพธ์และคุณก็สามารถเปิดเซสชัน ssh ของคุณได้ตราบใดที่สคริปต์ใช้งาน หากสิ่งเหล่านี้ไม่จริงฉันขอแนะนำให้ใช้screenกับหลายแท็บ คุณสามารถทำสิ่งที่ชอบ

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

การตรวจสอบผลลัพธ์ที่ฉันไม่เกี่ยวข้อง - ฉันไม่ต้องการออกจากเซสชัน ssh แล้วถ้าใช้ nohup ล่ะ สิ่งนี้จะป้องกันไม่ให้สคริปต์หยุดทำงานหากเซสชันสิ้นสุดลงไม่ใช่หรือ ฉันจะดูคำแนะนำหน้าจอของคุณด้วย ขอบคุณ!'
Tom

nohupอาจจะใช้งานได้ฉันคุ้นเคยกับscreenมันมากกว่าและมีฟังก์ชั่นอื่น ๆ อีกมากมายซึ่งอาจเป็นประโยชน์กับคุณหรือไม่ก็ได้
David King

2

ในการเริ่มต้นและจัดการงานสคริปต์จำนวนมากคุณจะต้องใช้ซอฟต์แวร์การจัดการบางอย่างเพื่อควบคุมการใช้ทรัพยากร (CPU, หน่วยความจำ, ลำดับความสำคัญ) ดูสถานะงาน (รอหยุดพักทำงานเสร็จ)

เครื่องมือสร้างกริดสร้างขึ้นเพื่อสิ่งนั้นตัวอย่างเช่น Sun Grid Engine ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) หรือ Open Grid Scheduler ( http://gridscheduler.sourceforge.net/ ) คุณต้องการให้ผู้ดูแลระบบติดตั้งซอฟต์แวร์ที่เหมาะสมกับคุณก่อนจึงจะสามารถเริ่มต้นได้ ผู้ดูแลระบบอาจมีความสุขที่ทำเช่นนั้นแทนที่จะเห็นหลายร้อยกระบวนการที่ทำงานบนเครื่องและไม่สามารถควบคุมพวกเขาได้

โดยทั่วไปผู้ดูแลระบบจะกำหนดจำนวนสล็อตที่เครื่องสามารถแบ่งออกเป็นและคุณส่งงานไปยังคิวและระบุจำนวนสล็อตที่งานต้องการใช้งานเอ็นจิ้นกริดจะตรวจสอบการใช้งานระบบโดยรวมและเรียกใช้งานตาม นโยบายการเข้าคิวที่กำหนดโดยผู้ดูแลระบบ เช่นไม่เกิน x งานที่สามารถเรียกใช้ในเวลาเดียวกัน ฯลฯ ส่วนที่เหลือของงานจะอยู่ในคิวในสถานะรอและปล่อยหลังจากงานก่อนหน้านี้เสร็จสิ้น



0

ฉันเคยทำสิ่งนี้มาหลายครั้งแล้วและโดยปกติฉันแค่ม้วนสคริปต์ของตัวเองเพื่อทำงานด้วยการควบคุมงาน โดยทั่วไปหากคุณมีชื่อของสคริปต์ทั้งหมดที่คุณต้องการเรียกใช้ในไฟล์โซลูชันจะมีลักษณะดังนี้:

#!/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

มันกำลังดุร้าย แต่มีประสิทธิภาพ นอกจากนี้คุณไม่จำเป็นต้องมีซอฟต์แวร์พิเศษใด ๆ เช่นการเพิ่มขนานในระบบของคุณ

ปัญหาใหญ่คือคำสั่งรอจะรอให้สคริปต์ที่ช้าที่สุดเสร็จซึ่งอาจเสียเวลา ฉันได้สร้างสคริปต์เพื่อดูแลสถานการณ์นี้ แต่มันซับซ้อนกว่าที่คุณจินตนาการได้ หากสคริปต์ทั้งหมดของคุณทำงานในระยะเวลาเท่ากันมันจะทำงานได้ดี

ปัญหาอีกประการหนึ่งคือคุณอาจต้องปรับแต่ง MAX_PROCS เพื่อพิจารณาประสิทธิภาพที่ดีที่สุด

แน่นอนจำนวนการเชื่อมต่อ ssh สามารถรับได้อย่างง่ายดาย ในกรณีนี้ให้ย้ายสคริปต์นี้ไปยังรีโมตโฮสต์และเปลี่ยนบรรทัด "ssh ... " เพื่อเรียกใช้สคริปต์โดยตรง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.