วิธีรับโค้ดส่งคืนของคำสั่ง scp ที่ล้มเหลวโดยมีข้อผิดพลาดในการเชื่อมต่อหายไปในเชลล์สคริปต์

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

scp ${HostUser}@${HostServer}:$4/*$no*.gz 
gunzip 

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

  1. ฉันสามารถเก็บโค้ดส่งคืนของคำสั่ง scp ไว้เพื่อที่ฉันจะได้รู้ว่าการถ่ายโอนไฟล์เสร็จสิ้นแล้วหรือไม่ หากการถ่ายโอนไม่เสร็จสิ้นสคริปต์จะล้มเหลวเพื่อให้คำสั่ง gunzip ไม่ต้องพยายามเปิดไฟล์ที่ไม่สมบูรณ์และเก็บค่าขยะไว้หลัง gunzip สั่งการ

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

โปรดแนะนำ


person Raj Malhotra    schedule 29.08.2014    source แหล่งที่มา


คำตอบ (1)


'$?' จะเก็บรหัสทางออกของคำสั่งสุดท้ายไว้เพื่อให้คุณสามารถกำหนดให้กับตัวแปรหลังคำสั่ง scp จากนั้นทำคำสั่ง if เพื่อตรวจสอบว่ารหัสทางออก = 0 เพื่อให้สำเร็จหรือไม่ จากนั้นรันคำสั่ง gunzip

scp ${HostUser}@${HostServer}:$4/*$no*.gz 
EXIT_STATUS=$?
if [ $EXIT_STATUS -eq 0 ]; then
   gunzip
else
   ...some error handling
fi
person Steak054    schedule 29.08.2014
comment
ต่อไปนี้คือรหัสส่งคืน ดังนั้นจึงระบุให้เจาะจงมากขึ้นได้ บางครั้งคุณไม่ต้องการจัดการกับข้อผิดพลาดเฉพาะเจาะจง เช่น เมื่อไม่มีไฟล์ที่ต้องประมวลผล (โค้ดส่งคืน 1) ข้อผิดพลาดการสูญเสียการเชื่อมต่อมีมากกว่า 1 - person Martin Braun; 10.04.2021