Estoy tratando de comprimir un archivo de imagen de una máquina virtual a través de un script, pero quiero asegurarme de que no se acceda al archivo. Podría verificar si virt-manager se está ejecutando, ya que debería ser el único programa que accede a la imagen, pero no sé si hay una mejor manera de hacerlo. También quiero que el script siga intentándolo hasta que el archivo esté disponible para comprimir. Yo tampoco sé cómo hacer eso.
#Check if virt-manager is running
if pgrep "virt-manager" > /dev/null
then
#re-run script until success
else
gzip -k < /home/brady/.vms/windows10/hdd.img > /media/backup/vms/windows10/hdd.$(date +"%F.%T).img.gz
Respuesta aceptada:
El lsof
El comando puede decirle si un archivo está en uso. Puedes poner eso en un while
bucle con un sleep
para que lo revise cada cierto tiempo.
Por ejemplo:
En la ventana 1 puedes ejecutar sleep 10000 > /tmp/x
En la ventana 2, ejecute este script:
#!/bin/bash
FILE=/tmp/x
while [ -n "$(lsof "$FILE")" ]
do
sleep 1
done
echo "File $FILE not in use"
Ahora cuando presionas control-C
para abortar el sleep
verá la respuesta "Archivo no en uso" en aproximadamente un segundo.