Não é possível excluir um arquivo usando o script bash

1

Estou tendo problemas para remover um arquivo em um script bash. Eu vi o outro post com o mesmo problema, mas nenhuma dessas soluções resolveu o meu problema. O script bash é uma verificação de vigilância do OP5 e chama um processo Esperado que salva um arquivo temporário na unidade local da qual o script bash lê. Depois de ler o arquivo e verificar seu status, eu gostaria de remover o arquivo temporário. Sou muito novo no script para que meu script não seja o melhor possível. De qualquer forma, ele faz o trabalho, exceto a remoção do arquivo, uma vez feito. Eu vou postar todo o código abaixo:

#!/bin/bash

#GET FLAGS
while getopts H:c:w: option
do
case "${option}"
in
        H) HOSTADDRESS=${OPTARG};;
        c) CRITICAL=${OPTARG};;
        w) WARNING=${OPTARG};;
esac
done

./expect.vpn.check.sh $HOSTADDRESS

#VARIABLES
VPNCount=$(grep -o '[0-9]\+' $HOSTADDRESS.op5.vpn.results)

# Check if the temporary results file exists
if [ -f $HOSTADDRESS.op5.vpn.results ]
then
# If the file exist, Print "File Found" message
echo Temporary results file exist. Analyze results.

else # If the file does NOT exist, print "File NOT Found" message and send message to OP5
echo Temporary results file does NOT exist. Unable to analyze.
# Exit with status Critical (exit code 2)
exit 2
fi

if [[ "$VPNCount" > $CRITICAL ]]
then
# If the amount of tunnels exceeds the critical threshold, echo out a warning message and current threshold and send warning to OP5
echo "The amount of VPN tunnels exceeds the critical threshold - ($VPNCount)"
# Exit with status Critical (exit code 2)
exit 2

elif [[ "$VPNCount" > $WARNING ]]
then
# If the amount of tunnels exceeds the warning threshold, echo out a warning message and current threshold and send warning to OP5
echo "The amount of VPN tunnels exceeds the warning threshold - ($VPNCount)"
# Exit with status Warning (exit code 1)
exit 1
else
# The amount of tunnels do not exceed the warning threshold.
# Print an OK message
echo OK - $VPNCount
# Exit with status OK
exit 0
fi

#Clean up temporary files.
rm -f $HOSTADDRESS.op5.vpn.results

Eu tentei as seguintes soluções:

  • Crie uma variável separada chamada TempFile que especifica o arquivo. E especifique isso no comando rm.

  • Eu tentei criar outra instrução if semelhante àquela que uso para verificar se o arquivo existe e, em seguida, rm o nome do arquivo.

  • Eu tentei adicionar o nome completo do arquivo (sem variáveis, apenas texto simples do arquivo)

Eu posso:

  • Remova o arquivo usando o nome completo em um script separado e diretamente na CLI.

Existe algo no meu script que bloqueia o arquivo que me impede de removê-lo? Não tenho certeza do que tentar em seguida.

Obrigado antecipadamente!

    
por Philip.J 08.06.2014 / 09:23

1 resposta

1

Quando você "sai", sai e a última linha do seu script não é acessada.

Primeira solução: mova a última linha abaixo do "echo Existem arquivos de resultados temporários. Analise os resultados." como é o lugar onde o arquivo existe e é analisado ...

Mas se você quer apagar esse arquivo em todos os casos e não tem um problam com o rm sendo feito em cada saída (ie, seja qual for a causa para sair do programa), em vez de sua última linha, defina (próximo ao início do roteiro!) uma função que é chamada quando o programa sai (usando "trap thefonction EXIT": significando: chame "thefonction" quando você EXITAR (ou o programa recebeu ctrl + c)) .

function onexit {
   # Your cleanup code here
   rm -f $HOSTADDRESS.op5.vpn.results
}

trap onexit EXIT

Mas você precisa ter certeza de definir a armadilha no momento certo (e que HOSTADDRESS é definido quando você faz isso!)

Note que se você "matar -9" o programa, ele não terá tempo de usar a armadilha (kill -9 só deve ser usado quando o kill normal não funcionar, já que ele não permite o programa a qualquer momento para usar a limpeza, etc ...)

    
por 08.06.2014 / 09:54