如何避免 systemd 中可執行檔的絕對路徑?

如何避免 systemd 中可執行檔的絕對路徑?

/etc/init我有多個不同的項目已經包含 Upstart 服務,並且正在實施將這些服務直接從 SVN 工作副本符號連結的方法。 Upstart 提供了嵌入式腳本,我可以在其中簡單地​​讀取符號連結的目標並執行其他腳本或服務本身的可執行檔。對於我的設定來說,重要的只是以下行:

cd "$(目錄名 "$(目錄名 "$(readlink "/etc/init/${UPSTART_JOB}.conf")")")"

這樣,我不需要對工作副本的任何絕對路徑進行硬編碼,而只需依賴符號連結和我的各個項目的一些定義的相對目錄佈局。我想為 systemd 實現相同的方法,但盡可能堅持其建議的概念,這似乎不支援我以前使用的嵌入式腳本。

我已經知道這systemctl enable /usr/local/.../someApp.service可以讓我將我的服務定義保留在 SVN 工作副本中。我目前唯一缺少的是正確採用我的readlink方法,不需要硬編碼絕對路徑。我讀過關於說明符已經,但根據我的理解,它們不提供絕對路徑,也不解析符號連結。

除此之外,我還可以使用附加命令列直接執行 shell,理論上可以將我的readlink方法嵌入其中。但這看起來很難看。

我想到的另一種方法是一些系統範圍的調度程序腳本,我已經有一些系統範圍的腳本/usr/local/vendor,我可以將說明符轉發到它並readlink在外部實現我的方法。

但我缺少什麼更簡單的東西嗎?像下面這樣簡單的東西,%f解析的符號連結目標在哪裡:

ExecStart = %f/../../bin/someApp.pl

這似乎比以下範例更容易:

ExecStart = /bin/sh -c "..."

ExecStart = /usr/local/vendor/systemd/dispatcher "%f"

謝謝!

答案1

不,systemd 沒有這方面的內建功能。

就像 Upstart 一樣,您必須呼叫 shell。

相關內容