Systemd
systemd 服務單元文件中的動態變數
有沒有辦法在 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=...