2012-03-08 15 views

Respuesta

3

Hay varias maneras de lograr esto:

  • Si puede, inicie el proceso desde su secuencia de comandos. La secuencia de comandos continuará cuando el proceso finalice y eso significa que no puede escribir más datos en el archivo.

  • Si no puede controlar el proceso pero sabe que el proceso finaliza después de escribir el archivo, puede encontrar el ID del proceso y luego verificar si el proceso todavía se está ejecutando con kill -0 $PID. Si $? es 0 después, el proceso aún está activo.

  • Si eso no es posible, entonces puede usar lsof -np $PID para obtener una lista de todos los archivos abiertos para este proceso y verificar si su archivo está en la lista. Esto es algo lento, sin embargo.

[EDIT] Tenga en cuenta que todos estos enfoques son algo frágiles. La solución correcta es hacer que el proceso externo escriba el archivo usando un nombre temporal y luego renombrarlo tan pronto como esté listo.

El cambio de nombre se asegura de que todos los demás ven el archivo completo con todos los datos o nada.

+0

¿qué tal '! lsof -/ruta/a/archivo'? – RubyTuesdayDONO

+0

@RubyTuesdayDONO: ¿Qué tal? –

+0

lo sugerí como una forma más directa de consultar si algún proceso tiene ese archivo específico abierto (frente a 'grep'' a través de una lista de todos los archivos abiertos por el proceso más probable).su recomendación secundaria sobre el cambio de nombre de los archivos temporales en su lugar parece una opción superior; solo quiero resaltar que 'lsof' es un comando sofisticado con múltiples vectores para localizar exactamente la información deseada. – RubyTuesdayDONO

2

La manera fácil: deje que el script ejecute el programa y espere hasta que haya terminado.

1

Esto no es agradable, y me hace sentir sucia escribirlo ... /tmp/foo.txt está siendo probado el archivo ...

#!/bin/bash 

until [ "$(find /proc/*/fd 2> /dev/null | 
    xargs -i{} readlink {} | 
    grep -c '^/tmp/foo.txt$')" == "0" ]; do 

    sleep 1; 
done; 
0

Bucle hasta que el archivo es el enfoque estable, esto debería funcionar si usted está esperando los resultados del experimento (por lo que no es necesario el control de eventos en tiempo real):

EXPECTED_WRITE_INTERVAL_SECONDS=1 
FILE="file.txt" 
while : ; do 
     omod=$(stat -c %Y $FILE) 
     # echo "OLD: $omod" 
     sleep $EXPECTED_WRITE_INTERVAL_SECONDS 
     nmod=$(stat -c %Y $FILE) 
     # echo "NEW: $nmod" 
     if [ $omod == $nmod ] ; then 
       break 
     fi 
done 
1

crear un pequeño programa en C usando inotify. El programa debería:

  1. Crear una instancia de inotify.
  2. Agregue un reloj a la instancia para el evento IN_CLOSE_WRITE para la ruta del archivo de interés.
  3. Espere al evento.
  4. Salir con un código apropiado.

Luego en su secuencia de comandos, invoque el programa con la ruta del archivo como argumento.

Puede ampliar esto agregando un argumento de tiempo de espera y permitiendo que se especifiquen diferentes eventos.

Cuestiones relacionadas