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

21

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

Dalam sebuah skrip, saya memulai soffice ; untuk mengubah odt ke pdf

Tampaknya soffice melepaskan diri dari proses skrip, dan mengembara untuk melakukan hal sendiri .. Oke, tidak apa-apa; Aplikasi GUI cenderung melakukan itu ...

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

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

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

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

Peter.O
sumber

Jawaban:

25

Anda dapat menggunakan lsof | grep /absolute/path/to/file.txtuntuk melihat apakah suatu file terbuka. Jika file terbuka, perintah ini akan mengembalikan status 0, jika tidak maka akan kembali 256 (1).

Ketahuilah bahwa perintah ini akan memakan waktu satu detik karena biasanya ada banyak file yang terbuka kapan saja.

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

Berikut ini 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 saat proses 'pyhton3.2' membuka file 'test.py'. Segera setelah file ditutup, ia beralih ke 'echo done' dan keluar.

Saya telah memasukkan 'sleep 0.5' di sana sehingga loop tidak terlalu mengganggu CPU. Kalau tidak, itu akan menggunakan cpu 100%.

Bonus Tampaknya ada cara mudah untuk biara dengan pdf:

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

Stefano Palazzo
sumber
Bungkus ini dalam satu lingkaran sampai dan Anda punya kesepakatan.
Nick Pascucci
Selesai itu. :-) Saya harap ini bukan gaya yang buruk - tidak perlu repot membaca tentang praktik terbaik. Lagipula itu bekerja dengan baik.
Stefano Palazzo
Terima kasih Stefano ... ya, itu berhasil ... jadi itu adalah jawaban yang baik dan benar .. Satu catatan, telah menyoroti bahwa apa yang terjadi di kantor tidak seperti yang saya pikirkan .. Sepertinya file sementara sedang dibuat dan file terakhir (mungkin / mungkin) diganti namanya setelah selesai ... Jadi saya sekarang melihat itu ... dalam hal ini, saya mungkin hanya perlu menunggu * keberadaannya ... ... dan terima kasih untuk tautannya di unoconv .. Saya akan memeriksanya .. (secara keseluruhan, saya mengonversi .pdf menjadi beberapa ..jpegs satu per halaman)
Peter.O
@ fred.bear menunggu sampai file yang ada, ganti jika-pernyataan dengan ini: if [ -f test.odf ]. (skrip bash kadang-kadang bisa sangat samar ...)
Stefano Palazzo
6
lsof -- /path/to/filesebagai gantinya cobalah untuk menghindari grep'ing
RubyTuesdayDONO