/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。