Como posso chmod automaticamente um arquivo criado por um serviço systemd?

Como posso chmod automaticamente um arquivo criado por um serviço systemd?

Eu tenho um serviço systemd que inicia o go-ethereum (geth), que então cria um soquete Unix que é usado para fornecer um console de controle. Meu problema é que meu usuário não consegue se conectar ao soquete Unix porque, embora meu usuário e o usuário do serviço estejam no mesmo grupo e o arquivo criado seja automaticamente propriedade do usuário do serviço e do grupo, o processo geth não ' t conceder permissão rw automaticamente ao grupo. Posso consertar isso executando a sudo chmod 660 /path/to/socketpartir de um terminal antes de usar o console, mas gostaria de fazer isso automaticamente, se possível.

O que tentei foi adicionar uma regra como esta à [Service]seção do arquivo de serviço: ExecStartPost=/bin/chmod 660 /path/to/socket. Acredito que isso não funcione porque há um atraso entre o início do processo de serviço e a criação do soquete. O ExecStartPostcomando então falha, o que, por sua vez, parece fazer com que o serviço seja encerrado.

Uma opção que posso ver para corrigir isso é escrever um script que verifique repetidamente a existência do arquivo e, em seguida, modifique as permissões do arquivo assim que ele for detectado. Então eu poderia mudar a regra para ExecStartPost=/path/to/script. Uma solução mais simples e possivelmente menos robusta na mesma linha poderia ser tornar a regra ExecStartPost=/bin/bash -c "sleep 5 && /bin/chmod 660 /path/to/socket".

Esse tipo de solução é a melhor opção ou o systemd fornece algum outro mecanismo/mais simples que poderia ser usado para meu propósito?

Responder1

O princípio orientador básico aqui é queo que quer que ligue o AF_LOCALsoquete deve definir suas permissões. Fazer o contrário é uma engenhoca frágil de Heath Robinson.

Se o programa de serviço daemon criar e vincular o soquete, procure opções de configuração que permitam especificar as permissões do soquete. Infelizmente, você pode descobrir que os autores do programa podem não ter pensado que as pessoas precisavam fazer isso.

Se o programa de serviço daemon não tiver esse mecanismo de configuração, então tente fazer o programa de serviço daemonreceberseu soquete de controle na inicialização como um descritor de arquivo já aberto, passou informações sobre esse descritor de arquivo por meio do LISTEN_FDSmecanismo (já que presumivelmente é um soquete de escuta que aceita solicitações de conexão). Então é o gerenciamento de serviço o responsável por criar e vincular o soquete e definir suas permissões, que o systemdfaztem botões para.

Em seguida, configure uma Accept=Nounidade de soquete systemd descrevendo esse soquete, incluindo a configuração apropriada ListenStream(já que presumivelmente a interface de controle é um soquete de fluxo) e uma SocketMode=0660configuração.

informação relacionada