Bir komut dosyasında, bir dosyanın şu anda başka bir işlem tarafından yazılmış olup olmadığını nasıl belirleyebilirim?


21

Ben komut dosyası bash için çok yeni, bu yüzden yanlış ağacı havlıyor olabilir, ama işte benim şu anki durumum:

Bir komut dosyasında, soffice ; Bir dönüştürmek için ODT a pdf

Görünüşe göre soffice kendini betiğin sürecinden ayırıyor ve kendi işini yapmak için yola çıkıyor .. Tamam, sorun değil; GUI uygulamaları bunu yapma eğilimindedir ...

Ancak yeni beklemek gerekir pdf sonraki adımım yeni olduğunu işleme karıştırmak gibi tamamen yazılmıştır pdf .

(Bildiğim kadarıyla) soffice'in işlem kimliğini kullanamıyorum, çünkü senaryom başlamadan önce zaten çalışan bir işlem olabilir: örn. soffice , ilgisiz başka bir belge / sunum / elektronik tablo için normal GUI aktivitesi için zaten açık olabilir.

Meselenin benim için anlamı, devam etmeden önce, yeni pdf'nin yazılmasının tamamlanması gerektiğidir.

Bir dosyanın artık "yazma" modunda başka bir işleme açık olmadığını belirlemenin bir yolu var mı ? ...

Yanıtlar:


25

lsof | grep /absolute/path/to/file.txtBir dosyanın açık olup olmadığını görmek için kullanabilirsiniz . Dosya açıksa, bu komut 0 durumunu, aksi halde 256 (1) döndürür.

Bu komutun, normalde herhangi bir zamanda çok fazla açık dosya bulunduğundan bir saniye alacağını unutmayın.

lsof -c geditÖrneğin, hangi dosyanın gedit'in açıldığını görmek için de kullanabilirsiniz . Çıktıyı tek bir işlemle sınırlandırmak, uygulama süresinin pratik olarak azalmasına neden olur.

İşte bekleyecek bir script:

#!/bin/bash

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

Bu işlem 'pyhton3.2' işlemi 'test.py' dosyasını açtığında çalışır. Dosya kapanır kapanmaz, 'yapılan eko'ya gider ve çıkar.

Oraya '0,5 uykusu' koydum, böylece döngü CPU'yu o kadar kötü sallamaz. Aksi takdirde,% 100 CPU kullanır.

Bonus pdt'ye pdf yapmanın kolay bir yolu var gibi gözüküyor:

Bu güzel ipucu için OOo Forum'daki scls19fr'a teşekkürler. Sen kullanarak komut satırından PDF OpenOffice Writer dosyalarını dönüştürebilirsiniz unoconv -f pdf input.odtunoconv almak için, sadece koşmak sudo apt-get install unoconvterminalinde. (rhyshale.wordpress.com'un rhyshale)


Bunu bir döngüye sarın, bir anlaşma yaptınız.
Nick Pascucci,

Bunu yaptım. :-) Umarım bu korkunç bir tarz değil - en iyi uygulamaları okumak için canınızı sıkmadı. Zaten iyi çalışıyor.
Stefano Palazzo

Teşekkürler Stefano ... evet, işe yarıyor ... bu yüzden iyi ve doğru bir cevap ... Bir yandan not, o cilada olanların düşündüğüm gibi olmadığını vurguladı. Geçici bir dosya gibi görünüyor oluşturuluyor ve son dosya (belki de / muhtemelen) tamamlandıktan sonra yeniden adlandırılıyor ... Bu yüzden şimdi bakıyorum ... bu durumda, sadece * varlığını beklemem gerekebilir ... ... ve unoconv bağlantıyı için teşekkürler .. ben içine bakacağız .. (genel olarak, birden ..jpegs sayfa başına bire .pdf dönüştürme ediyorum)
Peter.O

@ fred.bear bununla if ifadesi yerine, bir dosya var beklemek: if [ -f test.odf ]. (bash betiği bazen çok şifreli olabilir ...)
Stefano Palazzo

6
'ing lsof -- /path/to/fileönlemek için deneyingrep
RubyTuesdayDONO
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.