Tenho um aplicativo (um programa Python) em execução em um ambiente Linux que está gravando um arquivo em /tmp, com a expectativa de que o aplicativo exclua o arquivo em uma execução subsequente. O programa falha quando a execução anterior estava sob um ID de usuário diferente. Ele é executado em uma estação de trabalho compartilhada, o programa foi escrito por um usuário desse sistema, mas é usado por várias pessoas.
Tanto o contexto de execução (vários usuários executando o programa em momentos diferentes) quanto o local de armazenamento (/tmp) parecem normais e razoáveis para mim, mas gostaria de ajudar o usuário que escreveu o programa a melhorá-lo para evitar essas falhas ocasionais.
Existe alguma maneira de o programa criar o arquivo, de modo que o mesmo aplicativo possa excluí-lo quando executado como um usuário diferente? (Procurando ajuda geral sobre sistema operacional/sistema de arquivos aqui, não conselhos sobre programação.)
Observe que quero evitar alterar as permissões (por exemplo, remover o sticky bit) no diretório /tmp, o que normalmente impede isso.
Crie um subdiretório e escreva arquivos lá. Subdiretórios não herdam automaticamente
+t
.O ideal seria que o programa tentasse evitar colisões de nomes em primeiro lugar – há muito tempo é comum incluir no mínimo o ID do usuário no nome do arquivo (por exemplo
/tmp/tmux-1000
, ou/tmp/krb5cc_1000
escolher alguns aplicativos tradicionais). Useos.getuid()
para isso.Uma prática ainda melhor é gerar um nome aleatório, do jeito
tempfile.NamedTemporaryFile()
que ele faz. Você encontrará muitos desses em /tmp, como/tmp/ssh-XXXXv7kbdG
para seu ssh-agent.Alternativamente, o programa pode usar o diretório "cache" por usuário apropriado para o sistema operacional, por exemplo, um subdiretório do Linux
$XDG_CACHE_HOME
ou~/.cache
no Linux:platformdirs.user_cache_dir("MyApp")
."Compartilhado" costumava ser o padrão para muitos sistemas do tipo Unix, então o uso de um nome de arquivo fixo que causa tais colisões deve realmente ser considerado um bug.