A outra coisa que me ocorre, já que não é o backup, é que é um arquivo de travamento cuja função é impedir que outros usuários gravem no arquivo se ele já estiver aberto para gravação, o que não é uma má idéia.
Claramente, a melhor solução seria fazer com que seus usuários agissem com responsabilidade, mas isso, obviamente, é uma causa perdida:).
Então, o que eu faria seria executar um pequeno cronjob que procuraria por tais arquivos, verificar se o arquivo em questão está aberto no momento e, caso contrário, remover o arquivo de bloqueio. O problema é que a única maneira que conheço para verificar se um arquivo está aberto é lsof
, que lista os processos que atualmente estão acessando um determinado arquivo. No entanto, este só funcionará se for executado a partir do computador que está atualmente acessando o arquivo , não do servidor. Se você executá-lo no servidor e o usuário tiver aberto em sua máquina local, ele não retornará nenhuma saída.
Dependendo da sua configuração, você poderá estender isso verificando qual usuário criou o arquivo de trava e executando o script em sua máquina. Portanto, na esperança de que seja útil, aqui está o script que removerá os arquivos de referência referentes a arquivos que não estão abertos por nenhum programa na máquina atual :
#!/bin/bash
## Define the regular expression we will use
regex='(.*)~\$(.+)'
## Find all files that begin with "~\$*" in the directory
## specified on the command line, the lockfiles
find ${@} -name "~\$*" -print0 2>/dev/null | while IFS= read -r -d '' file; do
if [[ $file =~ $regex ]]
then
## Get the name of the file that created the lockfile
realname=${BASH_REMATCH[1]}${BASH_REMATCH[2]};
## Check if the file is currently open
isopen='lsof "$realname" 2>/dev/null | wc -l'
## If the file is not open (by a program running on the
## same machine as this script, delete the lockfile
if (( $isopen == 0))
then
echo "Deleting $file..."
rm "$file"
fi
fi
done