¿Cómo, en un script, puedo determinar si un archivo está siendo escrito por otro proceso?

21

Soy muy nuevo en bash scripting, por lo que podría estar ladrando el árbol equivocado, pero aquí está mi situación actual:

En un guión, comienzo soffice ; convertir un odt a un pdf

Parece que soffice se separa del proceso del guión y se aleja para hacer lo suyo ... De acuerdo, está bien; Las aplicaciones GUI tienden a hacer eso ...

Sin embargo, tengo que esperar hasta que el nuevo pdf se haya escrito completamente, ya que mi próximo paso implica procesar ese nuevo pdf .

(Que yo sepa) No puedo utilizar el ID de proceso de soffice, porque puede que ya haya sido un proceso en ejecución antes de que comenzara mi script: por ejemplo. soffice ya puede estar abierto para la actividad normal de la GUI para otro documento / presentación / hoja de cálculo no relacionado.

El quid de la cuestión para mí es que antes de poder continuar, la redacción del nuevo pdf debe estar finalizada ...

¿Hay alguna forma de determinar cuándo un archivo ya no está abierto a otro proceso en modo "escritura"? ...

Peter.O
fuente

Respuestas:

25

Puede usar lsof | grep /absolute/path/to/file.txtpara ver si un archivo está abierto. Si el archivo está abierto, este comando devolverá el estado 0; de lo contrario, devolverá 256 (1).

Tenga en cuenta que este comando tomará un segundo ya que, normalmente, hay muchos archivos abiertos en cualquier momento.

También puede usar lsof -c gedit, por ejemplo, para ver qué archivo ha abierto gedit. Restringir la salida a un proceso reducirá el tiempo de ejecución a prácticamente nada.

Aquí hay un script para esperar:

#!/bin/bash

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

Esto se ejecuta mientras el proceso 'pyhton3.2' tiene abierto el archivo 'test.py'. Tan pronto como se cierra el archivo, pasa a 'echo hecho' y sale.

Puse 'sleep 0.5' allí para que el bucle no acapare tanto la CPU. De lo contrario, usará 100% de CPU.

Bonificación Parece que hay una manera fácil de convencer odt a pdf:

Gracias a scls19fr en el Foro OOo por este hermoso consejo. Puede convertir archivos de OpenOffice Writer a PDF desde la línea de comandos usando unoconv -f pdf input.odtPara obtener unoconv, simplemente ejecute sudo apt-get install unoconven el terminal. (rhyshale de rhyshale.wordpress.com)

Stefano Palazzo
fuente
Envuelva esto en un bucle hasta y obtendrá un trato.
Nick Pascucci
Hecho eso :-) Espero que no sea un estilo terrible, no me he molestado en leer sobre las mejores prácticas. Funciona bien de todos modos.
Stefano Palazzo
Gracias Stefano ... sí, funciona ... así que es una respuesta buena y correcta ... Una nota al margen, ha resaltado que lo que está sucediendo en soffice no es lo que pensaba ... Parece que es un archivo temporal se está creando y el archivo final se renombra (tal vez / probablemente) al finalizar ... Así que ahora estoy viendo eso ... en cuyo caso, es posible que deba esperar su * existencia ... ... y gracias por el enlace en unoconv ... Lo investigaré ... (en general, estoy convirtiendo .pdf a múltiples ... jpegs uno por página)
Peter.O
@ fred.bear que esperar hasta que exista un archivo, reemplace la sentencia if con esto: if [ -f test.odf ]. (el script bash puede ser tan críptico a veces ...)
Stefano Palazzo
66
intente lsof -- /path/to/fileevitar el grep'ing'
RubyTuesdayDONO