ฉันจะบอกได้อย่างไรเมื่อกระบวนการเขียนไฟล์เสร็จแล้ว?


9

ฉันมีกระบวนการที่เกิดจากเปลือกหอย มีการทำงานเป็นกระบวนการพื้นหลังและการส่งออกไปยังฐานข้อมูลไฟล์ CSV /tmpใน

ฉันจะบอกได้อย่างไรว่ากระบวนการพื้นหลังเสร็จสมบูรณ์ (เสร็จสิ้น / เลิก) หรือเมื่อการล็อคไฟล์ CSV ถูกปิด ฉันวางแผนที่จะ FTP ไฟล์ไปยังโฮสต์อื่นเมื่อมีการเขียน แต่ฉันต้องการไฟล์ที่สมบูรณ์ก่อนที่จะเริ่มการถ่ายโอนไฟล์


ทำให้กระบวนการแจ้งให้คุณทราบอย่างใด ...
Lightness Races ใน Orbit

คำตอบ:


7

บน Linux ไฟล์นั้นไม่ได้ถูกล็อคแม้ในขณะที่โปรแกรมกำลังเขียนลงไป (ต่างจากหน้าต่าง)

เพื่อตรวจสอบว่ากระบวนการเสร็จสมบูรณ์แล้วใช้:

while [[ 1 ]]; do
  pgrep dbprocess &>/dev/null

  if [[ $? -eq 0 ]]; then
    echo still running
  else
    echo finished
    # start ftp transfer
  fi
  sleep 2
done

เพื่อตรวจสอบว่ากระบวนการเปิดไฟล์หรือไม่คุณสามารถใช้

  • lsof <file> มันจะแสดงรายการกระบวนการที่เปิด <file>

  • ls -l /proc/$(pgrep db-process)/fd แสดงรายการไฟล์ descriptors ที่เปิดโดยกระบวนการ db-process


7

คุณสามารถใช้waitเชลล์ในตัวเพื่อทำสิ่งนี้ให้สำเร็จ

waitbuiltin ก็เป็นสาเหตุที่ทำให้เปลือกเพื่อหยุดการรอคอยสำหรับงานพื้นหลังที่สมบูรณ์ คุณสามารถส่งงานเฉพาะเพื่อรอหรือรองานทั้งหมด

ตัวอย่างเช่น:

echo $(date): starting
sleep 5 &
echo $(date): do something else
wait
echo $(date): background job finished

ซึ่งผลลัพธ์ใน:

Thu Sep 25 12:06:48 EDT 2014: starting
Thu Sep 25 12:06:48 EDT 2014: do something else
Thu Sep 25 12:06:53 EDT 2014: background job finished
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.