Systemd

PrivateTmp=true 的服務如何訪問 /tmp 目錄中的 unix 套接字(例如,從執行在 Apache 中的 PHP 送出 Torque 作業)

  • December 20, 2018

我們有一個執行使用者送出的科學計算的網路伺服器。計算可能需要長時間執行,因此我們使用**Torque**資源管理器(又名 pbs_server)在少數計算節點上分發/調度它們。Torque 使用/tmp目錄中的 unix 域套接字進行通信,但 http 伺服器(以及從它派生的程序)無法訪問真正的/tmp目錄,因此對於這些程序來說,套接字似乎失去了,從而導致錯誤。

細節:

  • 網路伺服器正在執行 Apache,它作為具有 systemd 屬性PrivateTmp=true集的服務執行。這使服務擁有自己的/tmp與“真正的”根目錄/tmp 無關的目錄。
  • 這些作業實際上是從 PHP 送出的(在 Apache 程序中執行)。PHP 對 進行系統呼叫qsub,這是一個用於送出作業的 Torque 命令。因為qsub是從 PHP 呼叫的,所以它繼承了/tmpApache 的“假”目錄。
  • qsub在內部嘗試連接到位於/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 和其他命令知道關於新位置)。

感謝您提供的任何建議,這些建議可能會幫助我找到一種在不禁用 PrivateTmp for Apache 的情況下從 PHP 向 Torque 送出作業的方法。

2013 年,trqauthd停止使用 IP 套接字並切換到伺服器主目錄中的 Unix 域套接字。

同年晚些時候,trqauthd從主目錄切換到/tmp.

如您所見,自適應計算為您提供的唯一更改選項/tmp/trqauthd-unix是從原始碼重新編譯程序,將--with-trqauthd-sock-dir建構配置選項更改為表示/tmp. (/run/trqauthd也許?)

引用自:https://unix.stackexchange.com/questions/322231