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.