PrivateTmp=true 的服务如何访问 /tmp 目录中的 unix 套接字(例如,从 Apache 中运行的 PHP 提交 Torque 作业)

PrivateTmp=true 的服务如何访问 /tmp 目录中的 unix 套接字(例如,从 Apache 中运行的 PHP 提交 Torque 作业)

我们有一个网络服务器,可以执行用户提交的科学计算。计算可能需要长时间运行,因此我们使用扭矩资源管理器(又名 pbs_server)将它们分发/调度到少数计算节点上。 Torque 使用/tmp目录中的 unix 域套接字进行通信,但 http 服务器(以及从它派生的进程)无法访问真实/tmp目录,因此对于这些进程来说,套接字似乎丢失,从而导致错误。

细节:

  • Web 服务器正在运行 Apache,它作为具有 systemd 属性集的服务运行PrivateTmp=true。这会导致服务拥有自己的/tmp目录,与“真正的”根 /tmp 无关。
  • 这些作业实际上是从 PHP(在 Apache 进程中运行)提交的。 PHP 对 进行系统调用qsub,这是一个用于提交作业的 Torque 命令。因为qsub是从PHP调用的,所以它继承了Apache的“假”/tmp目录。
  • qsub在内部尝试连接到位于 的 unix 套接字/tmp/trqauthd-unix。但由于它看不到真正的 /tmp 目录,因此失败并出现以下错误: Error in connection to trqauthd (15137)-[could not connect to unix socket /tmp/trqauthd-unix: 2]

我能实现的唯一解决方案是编辑 systemd 下的 httpd.service 文件并将其更改PrivateTmp为 false。这确实解决了问题。但我不想这样做,因为(我假设)PrivateTmp 设置为 true 是有充分理由的。

我想知道是否有任何方法可以在不同的位置创建套接字,或者以某种方式建立到可以在 Apache(及其分叉进程)内使用的套接字的链接。

创建到套接字的链接很简单,但它并不能解决问题,因为我不知道有什么方法可以配置qsub在不同位置查找套接字。

请注意,套接字是由trqauthd服务(为正在运行的作业执行用户授权的 Torque 程序)创建的。 trqauthd 的文档提到(在一个晦涩的注释中)可以配置套接字的位置,但是任何文档中都没有说明如何实现这一点(更重要的是,如何让 qsub 和其他命令知道)关于新地点)。

感谢您提供任何可能帮助我找到从 PHP 向 Torque 提交作业的方法的建议没有禁用 Apache 的 PrivateTmp。

答案1

2013年,trqauthd停止使用 IP 套接字并切换到服务器主目录中的 Unix 域套接字。

同年晚些时候,trqauthd从主目录切换到/tmp

正如您所看到的,自适应计算为您提供的唯一更改选项/tmp/trqauthd-unix是从源代码重新编译程序,更改--with-trqauthd-sock-dir构建配置选项以表示/tmp. (/run/trqauthd也许?)

相关内容