Come, in uno script, posso determinare se un file è attualmente scritto da un altro processo?


21

Sono molto nuovo nello scripting di bash, quindi potrei abbaiare sull'albero sbagliato, ma ecco la mia situazione attuale:

In una sceneggiatura, inizio soffice ; per convertire un odt in pdf

Sembra che il soffice si distacchi dal processo della sceneggiatura e si allontani per fare le sue cose. Va bene, va bene; Le app della GUI tendono a farlo ...

Tuttavia, devo aspettare che il nuovo pdf sia stato completamente scritto, poiché il mio prossimo passo prevede l'elaborazione di quel nuovo pdf .

(Per quanto ne so) Non riesco a utilizzare l'ID di processo di soffice, perché potrebbe essere già stato un processo in esecuzione prima dell'avvio del mio script: ad es. il soffice potrebbe essere già aperto per la normale attività della GUI per un altro documento / presentazione / foglio di calcolo non correlato.

Il nocciolo della questione per me è che prima di poter procedere, la scrittura del nuovo pdf deve essere finalizzata ...

Esiste un modo per determinare quando un file non è più aperto a un altro processo in modalità "scrittura"? ...

Risposte:


25

Puoi usare lsof | grep /absolute/path/to/file.txtper vedere se un file è aperto. Se il file è aperto, questo comando restituirà lo stato 0, altrimenti restituirà 256 (1).

Tenere presente che questo comando richiederà un secondo poiché, in genere, ci sono molti file aperti in qualsiasi momento.

Puoi anche usare lsof -c gedit, ad esempio, per vedere quale file gedit ha aperto. Limitare l'output a un processo ridurrà i tempi di esecuzione praticamente a zero.

Ecco uno script da attendere:

#!/bin/bash

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

Questo viene eseguito mentre un processo 'pyhton3.2' ha il file 'test.py' aperto. Non appena il file viene chiuso, passa a 'echo done' ed esce.

Ho inserito 'sleep 0,5' in modo che il loop non si danneggi così tanto alla CPU. In caso contrario, utilizzerà il 100% di CPU.

Bonus Sembra esserci un modo semplice per evitare odt in pdf:

Grazie a scls19fr sul forum OOo per questo delizioso suggerimento. Puoi convertire i file di OpenOffice Writer in PDF dalla riga di comando usando unoconv -f pdf input.odtPer ottenere unoconv, esegui semplicemente sudo apt-get install unoconvsul terminale. (rhyshale di rhyshale.wordpress.com)


Avvolgi questo in un ciclo fino e hai un affare.
Nick Pascucci,

Fatto. :-) Spero non sia uno stile terribile - non mi sono preoccupato di leggere le migliori pratiche. Funziona bene comunque.
Stefano Palazzo

Grazie Stefano ... sì, funziona ... quindi è una risposta buona e corretta .. Una nota a margine, ha evidenziato che ciò che sta accadendo nel soffice non è come pensavo .. Sembra che un file temporaneo viene creato e il file finale viene (forse / probabilmente) rinominato al completamento ... Quindi ora sto guardando quello ... nel qual caso, potrei solo dover aspettare la sua * esistenza ... ... e grazie per il link su unoconv .. Lo esaminerò .. (nel complesso, sto convertendo .pdf in più ..jpeg uno per pagina)
Peter.O

@ fred.bear di aspettare fino a quando esiste un file, sostituire il se-dichiarazione con questo: if [ -f test.odf ]. (la sceneggiatura bash a volte può essere così enigmatica ...)
Stefano Palazzo

6
cerca lsof -- /path/to/fileinvece di evitare l grep'ing
RubyTuesdayDONO il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.