ในที่สุดฉันก็สามารถจัดการกับปัญหาที่ฉันต้องดิ้นรนเป็นเวลาสองสามสัปดาห์ ฉันใช้ SSH กับ "คีย์ที่ได้รับอนุญาต" เพื่อเรียกใช้คำสั่งจากระยะไกล ทั้งหมดเป็นเรื่องปกติยกเว้นเมื่อฉันทำในขณะที่ลูป ลูปสิ้นสุดลงหลังจากทำซ้ำใด ๆ ด้วยคำสั่ง ssh
เป็นเวลานานที่ฉันคิดว่านี่เป็นความแปลกประหลาด ksh แต่ตอนนี้ฉันค้นพบว่าทุบตีทำในความเป็นจริงเหมือนกัน
โปรแกรมตัวอย่างขนาดเล็กเพื่อสร้างปัญหาขึ้นอีกครั้ง นี่คือการกลั่นจากการใช้งานที่มีขนาดใหญ่ซึ่งจะนำภาพรวมและทำซ้ำพวกเขาระหว่างโหนดในคลัสเตอร์
#!/bin/bash
set -x
IDTAG=".*zone"
MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)"
REMOTE_HOST=sol10-target
ZFSPARENT=rpool
ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG " > /tmp/actionlist
#for RMT_FILESYSTEM in $(cat /tmp/actionlist)
cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED
do
echo ${RMT_FILESYSTEM}@${MARKER}
[ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
echo Remote Command Return Code: $?
done
(โปรดทราบว่ามีอักขระ TAB ในนิพจน์การค้นหา grep ตามคำจำกัดความของพฤติกรรมของตัวเลือกรายการ zfs "-H")
ตัวอย่างของฉันมีระบบไฟล์ ZFS บางอย่างสำหรับรูทซึ่ง "โซน" ทั้งหมดมีระบบไฟล์รูทบนชุดข้อมูลที่มีชื่อคล้ายกับ
สระว่ายน้ำ / โซน / app1zone
สระว่ายน้ำ / โซน / กลุ่ม 2 / app2zone
เป็นต้น
ลูปด้านบนควรสร้างสแน็ปช็อตสำหรับชุดข้อมูลแต่ละชุดที่เลือก แต่จะใช้งานได้เฉพาะในชุดแรกจากนั้นออกเท่านั้น
ให้โปรแกรมค้นหาจำนวนชุดข้อมูลที่เหมาะสมสามารถยืนยันได้อย่างง่ายดายโดยการตรวจสอบไฟล์ "/ tmp / actionlist" หลังจากสคริปต์มีอยู่
หากคำสั่ง ssh ถูกแทนที่ด้วยเช่นคำสั่ง echo ดังนั้นลูปจะวนซ้ำผ่านบรรทัดอินพุตทั้งหมด หรือรายการโปรดของฉัน - เพิ่ม "echo" ไปยังคำสั่งที่ละเมิด
ถ้าฉันใช้ for for loop แทนมันก็ใช้งานได้ แต่เนื่องจากขนาดที่เป็นไปได้ของรายการชุดข้อมูลซึ่งอาจทำให้เกิดปัญหากับความยาวบรรทัดคำสั่งที่ขยายสูงสุด
ตอนนี้ฉัน 99.999% แน่ใจว่ามีเพียงลูปที่มีคำสั่ง ssh ในพวกเขาเท่านั้นที่ทำให้ฉันมีปัญหา!
โปรดทราบว่าการวนซ้ำที่คำสั่ง ssh ทำงานเสร็จสมบูรณ์! ราวกับว่าข้อมูลถูกสอดเข้าในขณะที่ลูปหายไปอย่างกระทันหัน ... ถ้าบรรทัดอินพุตสองสามตัวแรกไม่ทำงานคำสั่ง ssh ดังนั้นลูปจะทำงานต่อไปจนกว่าจะรันคำสั่ง SSH จริง
ในแล็ปท็อปของฉันที่ฉันกำลังทดสอบสิ่งนี้ฉันมี Solaris 10 VMs สองตัวที่มีชุดข้อมูลตัวอย่างเพียงสองหรือสามชุดเท่านั้น แต่สิ่งเดียวกันก็เกิดขึ้นในระบบ SPARC ขนาดใหญ่ที่มีการใช้งานจริงและมีชุดข้อมูลจำนวนมาก
actionlist
การรับประทานอาหารของคุณ ลองเปลี่ยนเส้นทางอินพุตมาตรฐานของ ssh ไปที่/dev/null