Tenho uma estação de trabalho RHEL 8 que hospeda um aplicativo cuja interface gráfica do usuário (GUI) pode ser acessada via https.
Quando o aplicativo é iniciado, ele cria alguns arquivos de soquete /tmp
com nomes aleatórios e o .sock
sufixo:
$ ls -l /tmp/*.sock
srwx------ 1 app app 0 Dec 21 13:30 /tmp/supervisor-358513b0f6222d2339e4ab66d30b0037.sock
srwx------ 1 app app 0 Dec 21 13:31 /tmp/mongodb-358513b0f6222d2339e4ab66d30b0037.sock
srwx------ 1 app app 0 Dec 21 13:31 /tmp/livegui-358513b0f6222d2339e4ab66d30b0037.sock
$ file /tmp/*.sock
/tmp/supervisor-358513b0f6222d2339e4ab66d30b0037.sock: socket
/tmp/mongodb-358513b0f6222d2339e4ab66d30b0037.sock: socket
/tmp/livegui-358513b0f6222d2339e4ab66d30b0037.sock: socket
atualização: A parte "aleatória" dos nomes dos arquivos de soquete é, na verdade, um MD5 do caminho onde o aplicativo está instalado.
Quando as pessoas usam o aplicativo com frequência, ele funciona bem por semanas/meses, mas quando ninguém se conecta ao aplicativo por alguns dias, ele para de responder; quando isso acontece, posso ver que os .sock
arquivos foram excluídos enquanto os processos do aplicativo ainda estavam em execução...
Existe alguma maneira de evitar a exclusão de alguns arquivos no /tmp
?
Sim, veja
man 5 tmpfiles.d
: então crie um arquivo de configuração, por exemplo,/etc/tmpfiles.d/myappsocket.conf
com o conteúdo como:Com isso, o processo do gerenciador de arquivos temporários não deverá mais excluir o soquete do seu aplicativo.
A resolução preferida é que o aplicativo coloque o soquete em
/run
, porque é onde os padrões para esse tipo de coisa (observe a linha final da seção 3.15.2) dizem que tais coisas devem estar (tanto porque não são dados temporários, quanto porque nenhum sistema sensato limpa arquivos antigos,/run
exceto em uma reinicialização).A resolução menos preferida, mas ainda viável, é adicionar uma exceção para systemd-tmpfiles para
/etc/tmpfiles.d
excluir os arquivos da limpeza, conforme sugerido pela resposta de telcoM .Uma alternativa para ambas as opções, e significativamente mais complicada, seria fazer com que o próprio aplicativo gravasse substituições para os caminhos de soquete específicos em um arquivo
/run/tmpfiles.d
assim que ele soubesse quais são os caminhos.Independentemente de tudo isso, esse é um bug que deve ser relatado aos desenvolvedores do aplicativo (e possivelmente aos desenvolvedores do systemd, porque o systemd-tmpfiles não deveria remover soquetes de escuta, embora eu não tenha certeza de quando ele começou a evitar fazer isso, então isso pode ser apenas um resultado da versão do systemd no RHEL 8).
coloque-os em /var/run/user/UID/ em vez disso
Uma solução alternativa que não requer privilégios elevados seria atualizar regularmente os tempos de acesso dos
.sock
arquivos usando o crontab do usuário que executa os processos do aplicativo.Exemplo de entrada crontab para atualizar os horários de acesso dos
/tmp/*.sock
arquivos todos os dias à 01:00 AM: