Tengo un proceso externo que inicia una escritura en un archivo.
¿Cómo escribo el script que espera hasta que se cierra el archivo (cuando el otro proceso finaliza con la escritura)?Cómo esperar hasta que se cierre el archivo
Respuesta
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$?
es0
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.
La manera fácil: deje que el script ejecute el programa y espere hasta que haya terminado.
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;
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
crear un pequeño programa en C usando inotify
. El programa debería:
- Crear una instancia de
inotify
. - Agregue un reloj a la instancia para el evento
IN_CLOSE_WRITE
para la ruta del archivo de interés. - Espere al evento.
- 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.
- 1. jQuery Añadir archivo CSS y esperar hasta que se cargue?
- 2. Bien y forma limpia que esperar hasta que el archivo se cierra
- 3. ¿Cómo forzar a FileSystemWatcher a esperar hasta que se descargue el archivo?
- 4. Espere hasta que QWidget cierre
- 5. ¿Cómo puedo esperar hasta que el Parallel.ForEach complete
- 6. Cómo esperar hasta que esté conectado el depurador .NET remoto
- 7. ¿Esperar hasta que una condición sea verdadera?
- 8. esperar hasta que un proceso termina
- 9. X11: ¿esperar hasta que se vea una ventana?
- 10. Android Animation: ¿esperar hasta que termine?
- 11. JOptionPane.showMessageDialog ¿esperar hasta que se haga clic en Aceptar?
- 12. ¿Cómo esperar hasta que WebBrowser esté completamente cargado en VB.NET?
- 13. Esperar hasta que el jQueryanimation para completar dentro de bucle
- 14. ¿Cómo esperar hasta que exista un elemento para dojo?
- 15. ¿Cómo esperar a que se copie por completo un archivo?
- 16. ¿Cómo puedo hacer una pausa en la ejecución hasta que se cierre el nuevo formulario?
- 17. Esperar hasta que las roscas niño completado: Java Descripción
- 18. Cómo forzar a un programa a esperar hasta que se complete una solicitud HTTP en JavaScript?
- 19. .NET --- control de cuadro de texto - esperar hasta que el usuario se realiza escribiendo
- 20. Cómo esperar desde thread1 hasta que se lo notifique por thread2
- 21. En WatiN cómo esperar hasta que se complete la devolución de datos
- 22. En java, cómo esperar en múltiples `Condiciones` hasta que se indique cualquiera de ellas
- 23. Vibrar hasta que se cierre el cuadro de mensaje Windows Phone 7
- 24. cómo esperar mejor a que se libere un filelock
- 25. Bash: Utilizar while o hasta esperar hasta que no exista un PID
- 26. ¿Cómo es que un archivo no se escribe hasta que dejo el programa?
- 27. Cómo evitar que JFrame se cierre
- 28. RavenDb: Fuerza los índices a esperar hasta que no estén obsoletos mientras se prueban las unidades
- 29. ¿Cuál es una buena manera de esperar hasta que se actualice un archivo y luego leerlo en Perl?
- 30. ¿Cómo esperar a que un BackgroundWorker se cancele?
¿qué tal '! lsof -/ruta/a/archivo'? – RubyTuesdayDONO
@RubyTuesdayDONO: ¿Qué tal? –
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