Score:5

สคริปต์ bash สำรองอย่างง่ายพร้อม nohup และ rsync

ธง in

ฉันมีคำสั่งง่าย ๆ ต่อไปนี้เพื่อเริ่มกระบวนการสำรองข้อมูลในพื้นหลังด้วย nohup:

nohup rsync -a /src /เป้าหมาย &

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

nohup rsync -a /src/ /เป้าหมาย/ &
oldpid=$!
รอ $oldpid

ถ้า [[ $? -eq 0 ]]
แล้ว
        สะท้อน "ความสำเร็จ"
อื่น
        เสียงสะท้อน "ล้มเหลว"
ไฟ

ดูเหมือนว่ารหัสจะทำงานได้ดี แต่จริง ๆ แล้วตอนนี้ฉันทำไม่ได้ถ้านี่เป็นวิธีที่น่าเชื่อถือ ฉันมีความกังวลสองประการ:

  • ตัวแปรได้ $? ถูกเขียนทับเมื่อมีการเรียกใช้คำสั่งอื่นในระหว่าง?
  • คือ รอ $oldpid ยุ่งกับวิธีการแบบอะซิงโครนัสของ nohup?

หรือบางทีตรรกะนี้อาจเป็นเรื่องโง่ ๆ และมีแนวทางที่ดีกว่านี้?

marcelm avatar
cn flag
คุณใช้ cron เพื่อรันคำสั่ง rsync หรือไม่ ถ้าเคย คุณได้พิจารณาใช้ [chronic](https://github.com/docwhat/chronic) (และตรวจสอบว่า cron สามารถส่งเมลได้) หรือไม่
Score:4
ธง cn

ตามคำถาม:

ตัวแปรได้ $? ถูกเขียนทับเมื่อมีการเรียกใช้คำสั่งอื่นในระหว่าง?

คำตอบคือ ใช่. ตัวแปร $? มีสถานะการออกของงานล่าสุด ตัวอย่างเช่น:

$ เท็จ; ก้อง $?
1
$ เท็จ; จริง; ก้อง $?
0
$ เท็จ; จริง; เท็จ; ก้อง $?
1

เช่นเดียวกับตัวแปร $! มี PID ของงานเบื้องหลังล่าสุด

อ้างอิง: Devhints.io: สูตรโกงการเขียนสคริปต์ Bash


ตามคำถาม:

คือ รอ $oldpid ยุ่งกับวิธีการแบบอะซิงโครนัสของ ไม่อัพ?

ไม่ควร - มันไม่ได้ออกแบบมาสำหรับงานดังกล่าวใช่หรือไม่? :)


ตามคำถาม:

หรือบางทีตรรกะนี้อาจเป็นเรื่องโง่ ๆ และมีแนวทางที่ดีกว่านี้?

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

#!/bin/bash
rsync -a source.file ปลายทาง ไฟล์ 2>/dev/null

ถ้า [[ $? -eq 0 ]]; จากนั้น echo "สำเร็จ"; อื่น ๆ สะท้อน "ล้มเหลว"; ไฟ
  • 2>/dev/null ใช้ที่นี่เพื่อระงับข้อความแสดงข้อผิดพลาดของ รีซิงค์แต่คุณสามารถบันทึกไว้ในไฟล์ temp และแนบไปกับอีเมลได้

แต่คงไม่ใช่สคริปต์ทั้งหมด...


นอกจากนี้ ในแถวแรกของ ช่วยรอ มีการให้ข้อมูลดังต่อไปนี้

รอ: รอ [-fn] [id ...]

รอให้งานเสร็จสิ้นและส่งคืนสถานะการออก

ดังนั้นคุณสามารถใช้ผลลัพธ์ของ รอ โดยตรงภายใน ถ้า คำแถลง. ฉันได้ทำการทดสอบแนวทางนี้สำเร็จแล้ว

#!/bin/bash
nohup rsync -a source.file ปลายทางไฟล์ 2>/dev/null &
oldpid=$!

ถ้ารอ $oldpid
แล้ว
        สะท้อน "ความสำเร็จ"
อื่น
        เสียงสะท้อน "ล้มเหลว"
ไฟ
  • 2>/dev/null ใช้ที่นี่เพื่อระงับข้อความแสดงข้อผิดพลาดของ ไม่อัพ, ในขณะที่ รีซิงค์ ข้อความแสดงข้อผิดพลาดไปที่ไหนสักแห่งในพื้นหลัง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา