Pertanyaan Bagaimana, dalam skrip, dapatkah saya menentukan apakah file saat ini sedang ditulis oleh proses lain?


Saya sangat baru untuk bash scripting, jadi saya mungkin menggonggong pohon yang salah, tapi di sini adalah situasi saya saat ini:

Dalam naskah, saya mulai soffice; untuk mengonversi odt ke a pdf 

Tampaknya soffice memisahkan diri dari proses skrip, dan mengembara untuk melakukan urusannya sendiri. Oke, itu bagus; Aplikasi GUI cenderung melakukan itu ...

Namun saya harus menunggu sampai baru pdf telah sepenuhnya ditulis, karena langkah saya selanjutnya melibatkan pemrosesan yang baru itu pdf.

(Sejauh yang saya tahu) Saya tidak dapat menggunakan ID proses soffice, karena ini mungkin sudah merupakan proses yang berjalan sebelum skrip saya dimulai: mis. soffice mungkin sudah terbuka untuk aktivitas GUI normal untuk dokumen / presentasi / spreadsheet lain yang tidak terkait.

Inti masalah bagi saya adalah bahwa sebelum saya dapat melanjutkan, penulisan yang baru pdf harus diselesaikan ...

Apakah ada cara untuk menentukan kapan suatu file tidak lagi terbuka untuk proses lain dalam mode "tulis"? ...


17
2017-11-21 04:39


asal




Jawaban:


Kamu dapat memakai lsof | grep /absolute/path/to/file.txt untuk melihat apakah file terbuka. Jika file terbuka, perintah ini akan mengembalikan status 0, jika tidak maka akan mengembalikan 256 (1).

Ketahuilah bahwa perintah ini akan memakan waktu sedetik karena biasanya ada banyak file yang terbuka setiap saat.

Anda juga bisa menggunakan lsof -c gedit, misalnya, untuk melihat file mana yang dibuka gedit. Membatasi output ke satu proses akan mengurangi waktu eksekusi menjadi nol.

Berikut skrip untuk menunggu:

#!/bin/bash

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

Ini berjalan sementara proses 'pyhton3.2' telah mendapatkan file 'test.py' dibuka. Segera setelah file ditutup, ia bergerak ke 'echo done' dan keluar.

Saya telah menempatkan 'tidur 0,5' di sana sehingga loop tidak begitu banyak menghalang CPU. Jika tidak, ia akan menggunakan 100% cpu.

Bonus Sepertinya ada cara mudah untuk mengadakan odt ke pdf:

Terima kasih untuk scls19fr di OOo Forum   untuk tip yang indah ini. Anda dapat mengonversi   File OpenOffice Writer ke PDF dari   baris perintah menggunakan unoconv -f pdf input.odt Untuk mendapatkan unoconv, jalankan saja    sudo apt-get install unoconv pada   terminal.    (rhyshale dari rhyshale.wordpress.com)


20
2017-11-21 05:32



Bungkus ini dalam lingkaran sampai dan Anda punya kesepakatan. - Nick Pascucci
Lakukan itu. :-) Saya harap itu bukan gaya yang mengerikan - tidak perlu membaca tentang praktik terbaik. Ini bekerja dengan baik. - Stefano Palazzo♦
Terima kasih Stefano ... ya, itu berhasil ... jadi itu adalah jawaban yang baik dan benar .. Satu catatan samping, telah disorot bahwa apa yang terjadi di dalam soffice adalah tidak seperti yang saya pikir .. Tampaknya file sementara sedang dibuat dan terakhir file (mungkin / mungkin) diganti setelah selesai ... Jadi saya sekarang melihat itu ... dalam hal ini, saya mungkin hanya perlu menunggu * eksistensi... ... dan terima kasih atas tautan di unoconv .. Saya akan memeriksanya .. (secara keseluruhan, saya mengonversi .pdf menjadi beberapa ..jpegs satu per halaman) - Peter.O
@ fred.bear untuk menunggu hingga file ada, ganti if-statement dengan ini: if [ -f test.odf ]. (Script bash kadang-kadang bisa sangat samar ...) - Stefano Palazzo♦
mencoba lsof -- /path/to/file alih-alih untuk menghindari grep'ing - RubyTuesdayDONO