Impedir que um diretório em / tmp seja excluído

10

Costumo usar o /tmpdiretório na minha máquina Linux para armazenar arquivos temporários (por exemplo, PDFs de um site que deseja que eu faça o download primeiro, etc.) e costumo criar um diretório com meu nome de usuário. Mas em toda inicialização, ele (incluindo todos os arquivos) é excluído. Agora eu sei que posso inseri-lo /var/tmp, mas quero que todo o seu conteúdo seja excluído, mas que o próprio diretório seja mantido. Assim:

tmp
 |- me # this should stay
 |  |- foo1 # this should be deleted...
 |  |- bar1 # ...and this as well
 |- other stuff...

Há alguma maneira de fazer isso? Talvez com permissões ou com uma configuração especial?

Linux4win
fonte
1
Como solução alternativa, você pode colocar algum código nos arquivos de login do seu shell para "test & mkdir", conforme necessário.
Jeff Schaller
3
/tmpé provavelmente um tmpfssistema de arquivos. Esses arquivos não são realmente excluídos; eles são simplesmente armazenados na RAM e perdidos em uma reinicialização. É por isso que você obtém respostas que se resumem a "re-criá-lo na inicialização ou login"
MSalters

Respostas:

4

Uma solução seria usar um @reboottrabalho cron:

@reboot mkdir -p "/tmp/$USER"

Adicionar isso ao seu crontab crontab -efaria com que ele fosse executado sempre que a máquina inicializar.

Ou use

mkdir -p "/tmp/$USER"

no arquivo de inicialização do seu shell.

Em ambos os casos, você também pode querer usar

TMPDIR=/tmp/$USER
export TMPDIR

no arquivo de inicialização do seu shell, se você deseja usar esse diretório como o diretório temporário padrão.

Kusalananda
fonte
Isso a) criará diretórios para todos os usuários eb) será acionado também da inicialização 'fria'?
Linux4win 12/04/19
1
@ Linux4win Esta resposta atende às necessidades de um único usuário, porque foi assim que você formulou a pergunta. Não importa como a máquina é inicializada (quente, fria ou morna), mas não é acionada ao sair da hibernação (porque não é a inicialização).
Kusalananda
Por alguma razão, adicionar @reboot mkdir -p "/tmp/$USER"ao final do crontab não faz nada, enquanto a execução mkdir -p "/tmp/$USER"cria o diretório. O segundo não trabalho para mim, a propósito, porque eu preciso acessar meu /tmpatravés de outros programas, e atirando-se a cada vez que shell é meio chato ...
Linux4win
@ Linux4win O @reboottrabalho cron não cria um diretório? Você está recebendo algum email enviado para sua conta com alguma mensagem de erro do daemon cron?
Kusalananda
bem, não ... Talvez porque eu não tenha configurado mail? Ou isso não é necessário?
Linux4win 12/04/19
14

Eu uso pam-tmpdirpara isso: ele cria um diretório temporário privado do usuário no login. Para configurá-lo, adicione

session optional pam_tmpdir.so

aos serviços PAM apropriados; em um sistema baseado no Debian, a instalação do libpam-tmpdirpacote oferecerá isso para você, ou você pode adicionar a linha a /etc/pam.d/common-session. Na próxima vez que você fizer login, você encontrará um diretório /tmp/usercom seu ID de usuário TMPe TMPDIRdefinirá adequadamente.

Stephen Kitt
fonte
7
Você poderia explicar quais são os serviços PAM apropriados e como a linha pode ser adicionada a eles? Quais arquivos devem ser editados?
terdon
2

Se você não estiver executando um sistema com systemd e ele usar systemd-tmpfiles para gerenciar a limpeza, configure o diretório usando esse sistema.

Aqui está uma documentação completa . Você pode conseguir o que deseja criando /etc/tmpfiles.d/something.confcom conteúdos como:

d     /tmp/your_username   0750 your_user your_group  - -
viraptor
fonte
1

Conforme indicado nos comentários, /tmpé para arquivos transitórios e que não serão perdidos se forem excluídos. Se você estiver no meio de alguma coisa e a máquina reiniciar, tudo o que você escreveu lá desaparecerá e você terá que começar de novo, o que significa que esses arquivos podem não ter sido tão temporários, afinal.

Eu mantive um diretório temporário no meu diretório pessoal por muitos anos, começando quando um gigabyte tinha muito espaço e constatei que era necessária uma limpeza periódica para se livrar dos arquivos que haviam se tornado antigos e sujos. Na maioria das vezes, o que me restava após esse processo tinha menos de algumas semanas, então agora limpo-o com um trabalho cron que é executado uma vez por dia:

find $HOME/tmp -depth -mtime +30 -print0 | xargs -0 -r rm -rf

Qualquer coisa que eu baixe ou crie como semi-temporária vai para lá e o sistema limpa qualquer coisa que eu deixar para trás. Qualquer coisa que precise de um lar permanente fica muito antes do trabalho do cron se livrar dele.

Blrfl
fonte
mkdir a a/b; touch a/b/c. Agora aguarde até que seus 30 dias expirem. À medida que você exclui c, a atualização é feita b, o que significa que deve aguardar mais 30 dias. Da mesma forma com aquando você exclui b. Em segundo lugar, se você criar arquivos, bmas não tocar apor 30 dias, o adiretório será atingido rm -rfe apagará seus arquivos recentes em b.
roaima
find "$HOME"/tmp -mtime +30 -type f -delete; find "$HOME/tmp" -depth -mmin +60 -type d -exec rmdir {} + 2>/dev/nullfunciona para mim
roaima 7/04/19