limpeza após operação "dd"

2

Estou usando o dd com a opção "excl". Se interrompido com CTRL + C "dd" deixa o arquivo que criou e não terminou de gravar. Eu preciso limpá-lo em tal caso com a armadilha INT. No entanto, não sei como testar nesse caso se o arquivo já existia ou se foi criado por dd. Em outras palavras, se "excl" iniciou a saída do dd ou outra coisa. O status de saída pode não informar dentro da armadilha, pois outros comandos podem retornar o mesmo código. Colocar o arquivo if [-e] antes do dd funcionaria, mas não é atômico. O arquivo pode ser criado por algum outro aplicativo no meio. Só precisa de uma solução elegante.

    
por azerIO 12.05.2011 / 14:59

1 resposta

3

redirecionamento de arquivos e arquivos:

cleanup() {
    exec {fd}>&-
    rm -f "$out"
}

set -e
set -o noclobber
# with noclobber, redirection will fail if output file exists
exec {fd}>"$out" || exit 3
trap "cleanup; exit 4" INT TERM ERR EXIT
# write to already opened file
dd if=/dev/zero of=/dev/fd/$fd bs=256k count=$(( size*4 ))
# alternative to /dev/fd/$fd is redirecting with >&$fd
exec {fd}>&-

Arquivos temporários:

cleanup() {
    rm -f "$temp"
}

set -e
temp=$(mktemp "${out}_XXXXXX") || exit 3
trap "cleanup; exit 4" INT TERM ERR EXIT
dd if=/dev/zero of="$temp" bs=256k count=$(( size*4 ))
mv -n "$temp" "$out"
    
por 12.05.2011 / 18:08

Tags