Systemd

systemd 服務單元文件中的動態變數

  • March 30, 2022

有沒有辦法在 systemd 服務單元文件中動態分配環境變數?

我們有一台有 4 個 GPU 的機器,我們希望每個 GPU 啟動某個服務的多個實例。例如:

  • gpu_service@1:1.service
  • gpu_service@2:1.service
  • gpu_service@3:1.service
  • gpu_service@4:1.service
  • gpu_service@1:2.service
  • gpu_service@2:2.service
  • gpu_service@3:2.service
  • gpu_service@4:2.service
  • 令人作嘔

因此 1:1、2:1 等實際上是服務單元文件中的 %i。

為了讓服務綁定到特定的 GPU,服務執行檔會檢查某個環境變數,例如:

USE_GPU=4

有沒有辦法我可以在服務單元文件中獲取 %i 並通過一些(shell)函式執行它來導出 GPU 編號,然後我可以相應地設置 USE_GPU 環境變數?

最重要的是,我不想為了/etc/systemd/system/gpu_service@x:y.service/local.conf可以啟動更多實例而編寫多個文件的麻煩。

如果您小心,您可以在實例服務文件中合併一個小的 bash 腳本序列作為您的 exec 命令。例如

ExecStart=/bin/bash -c 'v=%i; USE_GPU=$${v%:*} exec /bin/mycommand'

字元串中的$$將成為傳遞給 bash 的結果中的單個$,但更重要的是不會${...}被 systemd 插值。(早期版本的 systemd 沒有記錄使用$$,所以我不知道當時是否支持)。

沒有內置的方式。你需要在你的服務開始之前做這些事情。一種方法是將其放入環境文件中。

[Service]
# Note you need to escape percentage sign
ExecStartPre=/bin/sh -c "my_awesome_parser %%i > /run/gpu_service_%i"
EnvironmentFile=/run/gpu_service_%i
ExecStart=...

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