Como um serviço com PrivateTmp = true pode acessar um soquete unix no diretório / tmp (por exemplo, para enviar tarefas de Torque do PHP em execução no Apache)?

3

Desculpe se o título é confuso. Aqui está o quadro geral:

Temos um servidor Web que realiza cálculos científicos enviados pelos usuários. Os cálculos podem ser de longa duração, por isso usamos o Torque gerenciador de recursos (também conhecido como pbs_server) para distribuir / agendar em um punhado de nós de computação. Torque faz uso de um soquete de domínio unix no diretório /tmp para comunicação, mas o servidor http (e os processos bifurcados a partir dele) não podem acessar o diretório /tmp true, portanto, para esses processos, o soquete parece estar ausente resultando em um erro.

Os detalhes:

  • O servidor da web está executando o Apache, que é executado como um serviço com a propriedade systemd PrivateTmp=true set. Isso faz com que o serviço tenha seu próprio diretório /tmp não relacionado à raiz / tmp "true".
  • Os trabalhos são realmente enviados do PHP (em execução no processo Apache). O PHP faz uma chamada do sistema para qsub , que é um comando de Torque para enviar um trabalho. Como qsub é chamado pelo PHP, ele herda o diretório "fake" /tmp do Apache.
  • qsub internamente tenta se conectar ao soquete unix localizado em /tmp/trqauthd-unix . Mas como não vê o diretório real / tmp, ele falha com o seguinte erro: Error in connection to trqauthd (15137)-[could not connect to unix socket /tmp/trqauthd-unix: 2]

A única solução que consegui foi editar o arquivo httpd.service em systemd e alterar PrivateTmp para false. Isso resolveu o problema. Mas eu prefiro não fazer isso porque (eu assumo) o PrivateTmp foi definido como verdadeiro por uma boa razão.

O que eu quero saber é se existe alguma maneira de ter o soquete criado em um local diferente ou de alguma forma fazer um link para o soquete que poderia ser usado dentro do Apache (e seus processos bifurcados).

Criar um link para o soquete é trivial, mas não resolve o problema porque eu não sei de nenhuma maneira de configurar o qsub para procurar o soquete em um local diferente.

Observe que o soquete é criado pelo trqauthd service (um programa de Torque que executa a autorização do usuário para executar tarefas). A documentação do trqauthd menciona (em uma nota obscura) que o local do soquete pode ser configurado, mas não há nenhuma indicação em qualquer documentação sobre como isso pode ser feito (e mais importante, como deixar qsub e outros comandos saberem sobre a nova localização).

Obrigado por qualquer sugestão que possa me ajudar a encontrar uma maneira de enviar trabalhos para o Torque do PHP sem desativar o PrivateTmp para o Apache.

    
por ricovox 10.11.2016 / 07:57

1 resposta

4

Em 2013, trqauthd parou de usar soquetes IP e mudou para um soquete de domínio Unix na página inicial do servidor diretório.

Mais tarde, no mesmo ano, trqauthd mudou do diretório home para /tmp .

Como você pode ver, a única opção que a Adaptive Computing lhe deu para alterar /tmp/trqauthd-unix é recompilar os programas a partir do código fonte, alterando a opção de configuração --with-trqauthd-sock-dir build para denotar um local diferente de /tmp . ( /run/trqauthd talvez?)

    
por 10.11.2016 / 09:57