Jak w skrypcie mogę ustalić, czy plik jest obecnie zapisywany przez inny proces?

21

Jestem bardzo nowy w bash skryptach, więc być może szczekam niewłaściwe drzewo, ale oto moja obecna sytuacja:

W skrypcie uruchamiam soffice ; przekonwertować odt na pdf

Wygląda na to, że soffice odrywa się od procesu skryptu i odchodzi, by zrobić coś własnego. Dobra, w porządku; Aplikacje GUI zwykle to robią ...

Muszę jednak poczekać, aż nowy plik PDF zostanie w pełni napisany, ponieważ moim następnym krokiem jest przetworzenie tego nowego pliku pdf .

(O ile mi wiadomo) nie mogę użyć identyfikatora procesu biura, ponieważ mógł on być już uruchomiony przed uruchomieniem mojego skryptu: np. biuro może być już otwarte dla normalnej aktywności GUI dla innego niepowiązanego dokumentu / prezentacji / arkusza kalkulacyjnego.

Sedno sprawy polega na tym, że zanim będę mógł kontynuować, pisanie nowego pliku pdf musi zostać sfinalizowane ...

Czy istnieje sposób, aby ustalić, kiedy plik nie jest już otwarty dla innego procesu w trybie „zapisu”? ...

Peter.O
źródło

Odpowiedzi:

25

Możesz użyć, lsof | grep /absolute/path/to/file.txtaby sprawdzić, czy plik jest otwarty. Jeśli plik jest otwarty, to polecenie zwróci status 0, w przeciwnym razie zwróci 256 (1).

Pamiętaj, że to polecenie potrwa sekundę, ponieważ zwykle w dowolnym momencie jest otwartych wiele plików.

Możesz także użyć lsof -c geditna przykład, aby zobaczyć, który plik gedit otworzył. Ograniczenie danych wyjściowych do jednego procesu skróci czas wykonywania praktycznie do zera.

Oto skrypt do oczekiwania:

#!/bin/bash

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

Działa to, gdy proces „pyhton3.2” otworzył plik „test.py”. Gdy tylko plik zostanie zamknięty, przechodzi do „zakończenia echa” i kończy działanie.

Wstawiłem tam „sleep 0,5”, aby pętla nie za bardzo uszkadzała procesor. W przeciwnym razie użyje 100% procesora.

Bonus Wydaje się, że istnieje łatwy sposób na konwertowanie odt na pdf:

Dzięki scls19fr na forum OOo za tę cudowną wskazówkę. Możesz przekonwertować pliki OpenOffice Writer do formatu PDF z wiersza poleceń, używając unoconv -f pdf input.odtAby uzyskać unoconv, po prostu uruchom sudo apt-get install unoconvna terminalu. (rhyshale z rhyshale.wordpress.com)

Stefano Palazzo
źródło
Zawinąć w pętlę kasową i masz umowę.
Nick Pascucci,
Skończone. :-) Mam nadzieję, że nie jest to okropny styl - nie zawracałem sobie głowy czytaniem najlepszych praktyk. W każdym razie działa dobrze.
Stefano Palazzo
Dzięki Stefano ... tak, to działa ... więc jest to dobra i poprawna odpowiedź .. Jedna uwaga dodatkowa podkreśliła, że ​​to, co dzieje się w biurze, nie jest takie, jak myślałem ... Wydaje się, że plik tymczasowy jest tworzony, a końcowy plik (prawdopodobnie / prawdopodobnie) zmienia nazwę po zakończeniu ... Więc teraz patrzę na to ... w takim przypadku może będę musiał poczekać na jego * istnienie ... ... i dzięki za link na unoconv .. Zajmę się tym (ogólnie przekształcam .pdf na wiele .. JPEG na jednym na stronie)
Peter.O,
@ fred.bear czekać, aż plik istnieje, wymienić IF-oświadczenie, z tego: if [ -f test.odf ]. (skrypt bash może być czasem tak tajemniczy ...)
Stefano Palazzo
6
lsof -- /path/to/filezamiast tego spróbuj uniknąć grep'ing
RubyT TuesdayDONO