Como excluir um diretório automaticamente quando um executável é morto

7

Muitas vezes, executamos um executável que precisa gravar / ler alguns arquivos temporários. Geralmente, criamos um diretório temporário, executamos o executável lá e excluímos o diretório quando o script é concluído.

Eu quero excluir o diretório mesmo se o executável for morto. Eu tentei envolvê-lo:

#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
/usr/local/bin/my_binary

Quando my_binary morre, o último processo em que o kernel excluirá o diretório, já que o script é o último processo que contém inode ; mas não consigo criar nenhum arquivo no diretório excluído.

#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
touch file.txt

saídas de touch: file.txt: No such file or directory

O melhor que consegui criar é excluir o diretório temporário quando o processo morrer, capturar os sinais mais comuns e executar um processo de limpeza com o cron:

#!/bin/bash
dir=$(mktemp -d /tmp/d.XXXXXX) && cd "$dir" || exit 99
trap 'rm -rf "$dir"' EXIT
/usr/local/bin/my_binary

Existe alguma maneira simples de criar um diretório realmente temporário que seja excluído automaticamente quando o binário atual morrer, não importa o quê?

    
por Joaquin Cuenca Abela 18.02.2014 / 16:24

2 respostas

2

Seu último exemplo é o mais seguro contra falhas.

trap 'rm -rf "$dir"' EXIT

Isso será executado enquanto o próprio shell ainda estiver funcional. Basicamente, o SIGKILL é a única coisa que ele não manipula, uma vez que o shell é terminado à força.
(talvez o SIGSEGV também não tenha tentado, mas pode ser capturado)

Se você não deixar o shell para limpar depois de si mesmo, a única outra alternativa possível é fazer com que o kernel faça isso. Isso normalmente não é um recurso do kernel, no entanto, há um truque que você pode fazer, mas ele tem seus próprios problemas:

#!/bin/bash
mkdir /tmp/$$
mount -t tmpfs none /tmp/$$
cd /tmp/$$
umount -l /tmp/$$
rmdir /tmp/$$

do_stuff

Basicamente, você cria uma montagem tmpfs e depois a desmonta. Quando o script estiver pronto, ele será removido.
A desvantagem, além de ser excessivamente complexa, é que, se o script morrer por qualquer motivo antes da desmontagem, você não terá uma montagem por aí. Isso também usa tmpfs, que consumirá memória. Mas você pode tornar o processo mais complexo e usar um sistema de arquivos em loop, e remover o arquivo que o faz depois de montado.

Por fim, o trap é melhor em termos de simplicidade e segurança, e, a menos que o script esteja sendo regularmente SIGKILLed, eu continuaria com ele.

    
por 19.02.2014 / 03:47
0

Você pode usar o espera incorporado para aguardar a conclusão de um trabalho em segundo plano:

blah &
wait
rm -rf $DIR
    
por 19.02.2014 / 00:48

Tags