Wie kann ich in einem Skript feststellen, ob eine Datei gerade von einem anderen Prozess beschrieben wird?

21

Ich bin sehr neu im Bash-Scripting, daher belle ich möglicherweise den falschen Baum an, aber hier ist meine aktuelle Situation:

In einem Skript starte ich soffice ; ein odt in ein pdf konvertieren

Es sieht so aus, als ob sich Soffice vom Script-Prozess löst und sich auf den Weg macht, um sein eigenes Ding zu machen. Okay, das ist in Ordnung. GUI-Apps neigen dazu, das zu tun ...

Ich muss jedoch warten, bis das neue PDF vollständig geschrieben wurde, da der nächste Schritt die Verarbeitung dieses neuen PDFs umfasst .

(Soweit ich weiß) Ich kann die Prozess-ID von soffice nicht verwenden, da sie möglicherweise bereits ausgeführt wurde, bevor mein Skript gestartet wurde: z. soffice ist möglicherweise bereits für normale GUI-Aktivitäten für ein anderes Dokument / eine Präsentation / eine andere Tabelle geöffnet.

Der springende Punkt für mich ist, dass das Schreiben des neuen PDFs abgeschlossen sein muss , bevor ich fortfahren kann ...

Gibt es eine Möglichkeit, festzustellen, wann eine Datei nicht mehr für einen anderen Prozess im Schreibmodus geöffnet ist? ...

Peter.O
quelle

Antworten:

25

Mit können Sie lsof | grep /absolute/path/to/file.txtsehen, ob eine Datei geöffnet ist. Wenn die Datei geöffnet ist, gibt dieser Befehl den Status 0 zurück, andernfalls 256 (1).

Beachten Sie, dass dieser Befehl eine Sekunde dauert, da normalerweise viele Dateien gleichzeitig geöffnet sind.

Sie können lsof -c geditbeispielsweise auch sehen, welche Datei gedit geöffnet hat. Wenn Sie die Ausgabe auf einen Prozess beschränken, wird die Ausführungszeit praktisch unbrauchbar.

Hier ist ein Skript zum Warten:

#!/bin/bash

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

Dies wird ausgeführt, während ein Prozess 'pyhton3.2' die Datei 'test.py' geöffnet hat. Sobald die Datei geschlossen ist, wechselt sie zu "Echo done" und wird beendet.

Ich habe dort 'sleep 0.5' eingefügt, damit die Schleife die CPU nicht so sehr belastet. Andernfalls wird 100% CPU verwendet.

Bonus Es scheint eine einfache Möglichkeit zu geben, odt in pdf umzuwandeln:

Vielen Dank an scls19fr im OOo Forum für diesen tollen Tipp. Sie können Openoffice Writer - Dateien in PDF über die Befehlszeile umwandeln Verwendung unoconv -f pdf input.odtUm unoconv, einfach laufen sudo apt-get install unoconvam Terminal. (Rhyshale von rhyshale.wordpress.com)

Stefano Palazzo
quelle
Wickle das in eine Kassenschleife und du hast einen Deal.
Nick Pascucci
Habe das gemacht. :-) Ich hoffe, es ist kein schrecklicher Stil - ich habe mich nicht darum gekümmert, Best Practices nachzulesen. Es funktioniert trotzdem gut.
Stefano Palazzo
Danke Stefano ... ja, es funktioniert ... also ist es eine gute und korrekte Antwort. Eine Randnotiz: Es hat gezeigt, dass das, was in Soffice passiert, nicht so ist , wie ich dachte. Es scheint, dass es sich um eine temporäre Datei handelt wird erstellt und die endgültige Datei wird (möglicherweise / wahrscheinlich) nach Fertigstellung umbenannt ... Ich schaue mir das jetzt an ... in diesem Fall muss ich möglicherweise nur auf die * Existenz warten ... ... und danke für den Link auf unoconv .. Ich werde es untersuchen .. (Insgesamt konvertiere ich .pdf in mehrere ..jpegs eins pro Seite)
Peter.O
@ fred.bear warten , bis eine Datei vorhanden ist , ersetzen Sie die if-Anweisung mit diesem: if [ -f test.odf ]. (bash script kann manchmal so kryptisch sein ...)
Stefano Palazzo
6
versuchen Sie lsof -- /path/to/filestattdessen, den grep'ing
RubyTuesdayDONO