Como impedir que uma pasta dentro do / tmp seja limpa?

12

Esta questão é sobre o Ubuntu 14.10 no meu laptop de desenvolvedor.

Eu tenho uma pasta /tmpque é usada por um aplicativo para colocar coisas temporárias lá. Esse aplicativo geralmente cria uma pasta temporária na minha propriedade e a apaga posteriormente. Por algum motivo, isso não funciona quando o homedir é criptografado. Então, em vez disso, fiz um link simbólico para /tmp/foodentro do meu homedir. Meu aplicativo pode escrever lá e transformá-lo em uma subpasta temporária.

Agora /tmp/fooé excluído toda vez que eu reinicio minha máquina. Até agora, eu apenas recriei a pasta manualmente após a reinicialização. Agora eu aprendi em Como o diretório / tmp é limpo? que existe um trabalho fazendo isso.

Eu olhei, /etc/init/mounted-tmp.confmas meu bashfu e especialmente meu findfu não são suficientes para fazer o que eu quero. Aqui está um trecho desse arquivo:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

O que eu quero fazer é adicionar uma condição que o apague tudo dentro /tmp/foo, mas não a /tmp/foosi próprio. Como faço isso?

simbabque
fonte
É /tmp/fooum diretório ou um arquivo?
terdon
Um diretório Existem arquivos dentro.
simbabque
Por que não adicionar mkdir /tmp/foologo antes end script?
Hagen von Eitzen
Apenas para sua informação pessoal (você já deve saber disso): a 14.10 atinge a EOL em julho de 2015, portanto, você deve realmente atualizar para o Vivid o mais rápido possível.
Léo Lam

Respostas:

20

/etc/init/mounted-tmp.conffaz parte do mountallpacote, portanto, quaisquer atualizações nesse pacote e as alterações sugeridas serão revertidas.

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

Em vez disso, de acordo com o padrão Filesystem Hierachy (FHS) ;

Em relação ao / tmp :

Os programas não devem assumir que quaisquer arquivos ou diretórios em / tmp sejam preservados entre as invocações do programa.

Em relação a / var / tmp :

O diretório / var / tmp é disponibilizado para programas que requerem arquivos ou diretórios temporários preservados entre as reinicializações do sistema. Portanto, os dados armazenados em / var / tmp são mais persistentes que os dados em / tmp.

Portanto, você deve alterar seu link simbólico para usar em /var/tmpvez de /tmp.

mgor
fonte
3
Exemplo clássico de quando você tem um martelo, tudo parece um prego.
WernerCD
@WernerCD você poderia elaborar o que você quer dizer com isso? Você está dizendo que /var/tmpnão é uma boa ideia?
simbabque
6
Quando tudo que você tem é um martelo ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.Estou dizendo que o OP está usando / tmp para algo que não deve ser usado - Usando / tmp como martelo para o problema de manter o tmp-mas-não-bastante coisas -tmp. / var / tmp deve ser mantido entre as reinicializações, portanto é a resposta certa.
WernerCD
8

Não é uma resposta estrita à sua pergunta, mas você pode achar /var/tmpum local mais adequado, pois ele não é limpo durante uma reinicialização. Ele foi projetado para arquivos temporários que não devem ser descartados automaticamente após um curto período de tempo.

O que costumo fazer, no entanto, é criar uma pasta em / opt para armazenar coisas aleatórias que não quero em casa. É um local adequado para colocar coisas que estão fora do controle do sistema operacional principal.

Andrew Aylett
fonte
Essa é a ideia certa. Se / tmp não fizer o que você deseja, armazene suas informações em outro lugar - mesmo em outra unidade, se houver espaço disponível. Não mexa nas coisas que o Linux (e outros programadores) esperam ser de uma certa maneira, a menos que seja a única maneira de obter o resultado que você precisa.
Joe
6

Igual a:

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

Exemplo:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

Concordo com o usuário aap: Você deve cuidar disso no software usado, recriando o diretório lá se eles forem arquivos tmp ou usar outro diretório se eles não forem arquivos tmp que não sejam eliminados.

Rinzwind
fonte
Isso realmente não funciona. Enquanto o findcomando funciona conforme o esperado quando executado manualmente, o diretório ainda é removido após a edição /etc/init/mounted-tmp.conf. Parece que algo mais está acontecendo aqui.
terdon 12/06/15
wth. ehm. isso deve significar que a 1ª linha está com defeito. talvez ele precisa ser relativa (?)
Rinzwind
@terdon sim parece que ele precisa ser em relação ao / tmp /
Rinzwind
Acho que não, tentei várias permutações, inclusive -path ./fooe mesmo -name '*foo*'e nenhuma delas funcionou (no Ubuntu Server 14.04). Acho que esse não é o arquivo certo e estamos procurando no lugar errado. O que você está sugerindo deve funcionar, simplesmente não parece.
terdon 12/06
0

É uma má idéia ter arquivos com valor futuro, gravar no diretório / tmp (/ var / tmp, como sugerido por outros, é um lugar melhor). Dito isto, você pode tentar o chattr. Isso deve ser executado após a saída do aplicativo, mas antes de um desligamento. Lembre-se de que esta operação não permitirá que nada grave nesse diretório a partir de agora.

toque em /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me

Hopping Bunny
fonte
Como isso seria útil se eu quiser ter um diretório temporário?
19615 simbabque
-1

Rode isto:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

Adicione isso ao / etc / inittab veja aqui: onde está o arquivo inittab? :

foo:2345:boot:/bin/foodel

Isso criará o / etc / foo na inicialização, se ele não existir, e o esvaziará.

Isso fará o mesmo no login do bash:

echo "/bin/foodel" >> ~/.bashrc
Daniel
fonte
Ubuntu versão 14 não usa /etc/inittab. Isso é declarado de forma clara e inequívoca em sua página de manual.
JdeBP
* facepalm * Desculpe, @JdeBP, é isso que acontece comigo depois de manipular 4 versões diferentes do linux. Ele pode colocar o código em algum lugar declarou askubuntu.com/questions/34308/where-is-inittab-file
Daniel