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


21

ฉันใหม่มากในการทุบตีสคริปต์ดังนั้นฉันอาจเห่าต้นไม้ผิด แต่นี่คือสถานการณ์ปัจจุบันของฉัน:

ในบทที่ผมเริ่มต้นsoffice ; เพื่อแปลงodtเป็นpdf

มันดูเหมือนว่าsofficeแยกตัวเองจากกระบวนการของสคริปต์และเดินออกไปทำสิ่งที่เป็นของตัวเอง .. เอาล่ะที่ดีของ; แอพ GUI มักจะทำเช่นนั้น ...

อย่างไรก็ตามฉันต้องรอจนกว่าPDFใหม่จะถูกเขียนอย่างสมบูรณ์เนื่องจากขั้นตอนต่อไปของฉันเกี่ยวข้องกับการประมวลผลpdfใหม่นั้น

(เท่าที่ฉันรู้) ฉันไม่สามารถใช้ ID กระบวนการของ soffice ได้เพราะอาจเป็นกระบวนการที่ใช้งานอยู่ก่อนสคริปต์ของฉันจะเริ่มทำงานเช่น sofficeอาจเปิดอยู่แล้วสำหรับกิจกรรม GUI ปกติสำหรับเอกสาร / งานนำเสนอ / สเปรดชีตอื่นที่ไม่เกี่ยวข้อง

ประเด็นสำหรับฉันคือก่อนที่ฉันจะสามารถดำเนินการต่อได้การเขียนPDFใหม่จะต้องเสร็จสิ้น ...

มีวิธีใดบ้างที่จะกำหนดว่าเมื่อใดที่ไฟล์จะไม่เปิดไปยังกระบวนการอื่นในโหมด "เขียน" อีกต่อไป ...

คำตอบ:


25

คุณสามารถใช้lsof | grep /absolute/path/to/file.txtเพื่อดูว่าไฟล์เปิดอยู่หรือไม่ หากไฟล์เปิดอยู่คำสั่งนี้จะส่งคืนสถานะ 0 มิฉะนั้นจะส่งคืน 256 (1)

โปรดระวังว่าคำสั่งนี้จะใช้เวลาหนึ่งวินาทีเนื่องจากโดยปกติจะมีไฟล์จำนวนมากเปิดอยู่ตลอดเวลา

นอกจากนี้คุณยังสามารถใช้lsof -c geditเพื่อดูว่า gedit เปิดไฟล์อะไร การ จำกัด เอาต์พุตให้กับหนึ่งกระบวนการจะลดเวลาดำเนินการให้เหลือน้อยที่สุด

นี่คือสคริปต์ที่จะรอ:

#!/bin/bash

while :
do
    if ! [[ `lsof -c python3.2 | grep test.py` ]]
    then
        break
    fi
    sleep 0.5
done
echo "done"

สิ่งนี้จะทำงานในขณะที่กระบวนการ 'pyhton3.2' เปิดไฟล์ 'test.py' ทันทีที่ไฟล์ถูกปิดมันจะย้ายไปที่ 'echo done' และออก

ฉันใส่ 'sleep 0.5' ไว้ที่นั่นเพื่อที่ลูปจะไม่ทำให้ CPU ไม่ดีเท่าที่ควร มิฉะนั้นจะใช้ cpu 100%

โบนัส ดูเหมือนจะเป็นวิธีที่ง่ายในการจัดการกับ PDF:

ขอบคุณ scls19fr บนฟอรัม OOo สำหรับเคล็ดลับที่น่ารักนี้ คุณสามารถแปลงไฟล์ OpenOffice Writer เป็น PDF จากบรรทัดคำสั่งโดยใช้unoconv -f pdf input.odtเพื่อรับ unoconv เพียงแค่รัน sudo apt-get install unoconvที่เทอร์มินัล (rhyshale ของ rhyshale.wordpress.com)


ห่อสิ่งนี้ไว้ในห่วงจนกว่าคุณจะได้ข้อตกลงแล้ว
Nick Pascucci

เสร็จแล้ว :-) ฉันหวังว่ามันจะเป็นสไตล์ที่แย่มาก - ยังไม่ได้อ่านวิธีปฏิบัติที่ดีที่สุด มันทำงานได้ดีอยู่แล้ว
Stefano Palazzo

ขอบคุณ Stefano ... ใช่มันใช้งานได้ ... ดังนั้นจึงเป็นคำตอบที่ดีและถูกต้อง .. หมายเหตุด้านหนึ่งมันได้เน้นว่าสิ่งที่เกิดขึ้นใน soffice ไม่ใช่อย่างที่ฉันคิด .. ดูเหมือนว่าไฟล์ชั่วคราว กำลังถูกสร้างขึ้นและไฟล์สุดท้ายคือ (อาจจะ / อาจ) เปลี่ยนชื่อเมื่อเสร็จสิ้น ... ดังนั้นตอนนี้ฉันกำลังดูที่ ... ในกรณีนี้ฉันอาจต้องรอ* อยู่ได้ ... และขอขอบคุณสำหรับลิงค์บน unoconv .. ฉันจะตรวจสอบมัน .. (โดยรวมฉันกำลังแปลง. pdf เป็นหลาย .. jpegs หนึ่งรายการต่อหน้า)
Peter.O

@ fred.bear จะรอจนกว่าไฟล์ที่มีอยู่แทนคำสั่ง if if [ -f test.odf ]ด้วยนี้ (สคริปต์ทุบตีอาจเป็นความลับได้ในบางครั้ง ... )
Stefano Palazzo

6
พยายามlsof -- /path/to/fileแทนเพื่อหลีกเลี่ยงการgrep'ing
RubyTuesdayDONO
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.