สาเหตุ SSH ในขณะที่วงจะหยุด


30

ในที่สุดฉันก็สามารถจัดการกับปัญหาที่ฉันต้องดิ้นรนเป็นเวลาสองสามสัปดาห์ ฉันใช้ 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 ขนาดใหญ่ที่มีการใช้งานจริงและมีชุดข้อมูลจำนวนมาก


7
SSH อาจจะอ่านจากอินพุตมาตรฐาน, actionlistการรับประทานอาหารของคุณ ลองเปลี่ยนเส้นทางอินพุตมาตรฐานของ ssh ไปที่/dev/null
BatchyX

ฉันจะลองดู ฉันต้องการที่จะเพิ่มที่วาง SSH ในห่อไม่ได้ช่วย ....
โยฮัน

คุณถูก. ฉันจะไม่เห็นอย่างนั้นได้อย่างไร!
Johan

@BatchyX ฉันคิดว่าความคิดเห็นของคุณมีคุณสมบัติเป็นคำตอบ
CVn

ฉันเห็นด้วยฉันต้องการ "ยอมรับ" คำตอบดังนั้นหาก @BatchyX สามารถโพสต์ใหม่ได้เช่นนี้ฉันจะทำเช่นนั้น
Johan

คำตอบ:


43

SSH อาจอ่านจากอินพุตมาตรฐานทำให้หมดรายการการกระทำของคุณ ลองเปลี่ยนเส้นทางอินพุตมาตรฐานของ ssh ไปที่ / dev / null:

ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER} </dev/null

ตามกฎทั่วไปเมื่อเรียกใช้คำสั่งที่อาจรบกวนอินพุตมาตรฐานภายใต้while readลูป -style ฉันชอบที่จะหุ้มส่วนลูปทั้งหมดเป็นวงเล็บปีกกา:

cat /tmp/uuoc | 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: $?
} < /dev/null; done

3
ยอดเยี่ยมมากสำหรับการใช้วงเล็บปีกกาครั้งแรก ... ซึ่งฉันมีใน 20 ปีของสคริปต์ไม่เคยพบ (อย่างน้อยก็ไม่ใช่ที่ฉันจำได้) และสำหรับการอนุมาน uuoc FWIW (และในการป้องกันของฉันเอง) บางครั้งฉันทำข้อยกเว้นและเพิ่มคำสั่ง cat ซ้ำซ้อนเพื่อประโยชน์ในการอ่าน! ฉันชอบฟอรัมนี้เพราะฉันเรียนรู้สิ่งใหม่ ๆ ทันที! โดยเฉพาะฉันชอบที่จะเพิ่มการเปลี่ยนเส้นทางไปยังจุดเริ่มต้นของบรรทัดเช่นนี้ แต่ในฟอรัมที่ดูเหมือนจะทำให้เกิดความสับสนทำให้ฉันได้รับการตอบกลับที่มีประโยชน์น้อยลง!
Johan

ฉันพยายามที่จะหาข้อแตกต่างระหว่าง {... } และ (... ) หน้า man ksh กล่าวว่า {... } เป็นคำค้นหาพิเศษที่รู้จักที่จุดเริ่มต้นของบรรทัดคำสั่งเท่านั้น แต่มีความแตกต่างอื่น ... ( </tmp/file [ -z "$SOMEVAR" ] && awk '{print "X", $0}' )แตกต่างกันด้วยเครื่องหมายปีกกา ผมหมายถึงในแง่ของการส่งออกที่ผลิตไม่ได้เกี่ยวกับความจริงที่ว่าปิดวงเล็บปีกกาจะต้องอยู่ในบรรทัดใหม่ ...
โจฮาน

5
นอกจากนี้sshของ OpenSSH มี-nตัวเลือกที่ทำให้มัน (อย่างมีประสิทธิภาพ) เปิด stdin ใหม่จาก / dev / null
Chris Johnsen

มีวิธีแก้ปัญหาใดsudoบ้างสำหรับใช้กับคำสั่งในลูป?
bonh

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