- Łukasz Stelmach – Java JBoss Linux - http://blog.stelmisoft.pl -

Automatyczna kompilacja pliku LaTeX, czyli o monitorowaniu zmian w plikach

Spotkałem się z następującym problemem: w momencie wykonania modyfikacji pewnych plików lub katalogów chciałem wykonać określoną akcję. W moim przypadku chodzi o automatyczne utworzenie pliku PDF na podstawie plików źródłowych stworzonych w LaTeXu.

W przypadku Linuksa mamy do dyspozycji podsystem jądra o nazwie inotify [1], który pozwala na powiadamianie aplikacji o różnych zmianach mających miejsce w ramach systemu plików. Ponieważ jest to moduł pracujący w przestrzeni jądra systemu, nie ma potrzeby skanowania systemu plików w celu poszukiwania zmian. Wystarczy jedynie zarejestrować aplikację, podać jakie zdarzenia i pliki (czy też katalogi) mają być monitorowane i o resztę będzie się troszczyć sam systemu operacyjny.

Oczywiście, to że jądro udostępnia jakąś usługę i istnieją odpowiednie biblioteki systemowe nie rozwiązuje problemu (chyba że piszemy własną aplikację). Znalazłem dwie aplikacje, które działają w przestrzeni użytkownika i pozwalają na wykorzystanie inotify:

W moim przypadku incron jest za dużym rozwiązaniem, nie potrzebują także ciągłego monitorowania wybranych katalogów, jedynie na czas pracy z LaTeXem. Idealnym rozwiązaniem okazało się użycie polecenia inotifywait. Nasłuchuje ono na zamiany w wybranych plikach czy katalogach i w momencie ich wystąpienia kończy swoje działanie jednocześnie wyświetlając informacje o tym, co zostało zmienione. Posiada także możliwość pracy w trybie ciągłego nasłuchiwania, czyli informuje nas o zmianach bez kończenia działania, ale tutaj funkcja ta nie będzie potrzebna.

Więc czas na konkrety: instalacja pakietu w Ubuntu:

# aptitude install inotify-tools

Teraz czas na mały skrypt, który będzie odpowiedzialny za uruchomienie nasłuchiwania oraz wykonywanie odpowiednich poleceń:

1
2
3
4
5
6
7
8
9
#!/bin/bash

MONITOR_COMMAND="inotifywait -q -e modify  --format '%w%f' --excludei '.*temp.*' ."

while true
do
        OUTPUT=`$MONITOR_COMMAND` && \
                pdflatex -output-directory=out main.tex
done;

Skrypt robi:

W zmiennej $OUTPUT znajdzie się lista zmodyfikowanych plików, więc w razie potrzeb można na niej wykonać określone akcje.

Skrypt ten będzie działał w nieskończoność, do momentu przerwania jego wykonywania. Dzięki niemu można mieć podgląd wygenerowanych dokumentów LaTeX prawie w czasie rzeczywistym.

Źródła