systemd で実行可能ファイルへの絶対パスを回避するにはどうすればよいでしょうか?

systemd で実行可能ファイルへの絶対パスを回避するにはどうすればよいでしょうか?

私はすでに Upstart サービスを含む複数の異なるプロジェクトを持っており、/etc/initSVN 作業コピーからそれらのサービスを直接シンボリックリンクするアプローチを実装しています。Upstart は埋め込みスクリプトを提供し、シンボリックリンクのターゲットを読み取り、追加のスクリプトまたはサービス自体の実行可能ファイルを実行することができます。私のセットアップで重要なのは、次の行だけです。

cd "$(dirname "$(dirname "$(readlink "/etc/init/${UPSTART_JOB}.conf")")")"

この方法なら、作業コピーへの絶対パスをハードコードする必要はなく、さまざまなプロジェクトのシンボリックリンクと定義された相対ディレクトリレイアウトに頼るだけです。systemd にも同じアプローチを実装したいのですが、以前使用していたような埋め込みスクリプトをサポートしていないと思われる、提案されたコンセプトにできるだけ従いたいです。

私はすでにそれがsystemctl enable /usr/local/.../someApp.service私にできることを知っているサービス定義をSVN作業コピーに保存する現時点で私が欠けている唯一のことは、readlink絶対パスをハードコードする必要がないように私のアプローチを適切に採用することです。指定子すでにありますが、私の理解では、絶対パスは提供されず、シンボリックリンクも解決されません。

これら以外にも、追加のコマンド ラインを使用してシェルを直接実行し、理論的にはそこに自分のアプローチを埋め込むことができますreadlink。しかし、見た目が醜いです。

私が考えているもう 1 つのアプローチは、システム全体のディスパッチャ スクリプトです。すでにシステム全体の があり/usr/local/vendor、これに指定子を転送して、私のreadlinkアプローチを外部的に実装することができます。

しかし、私が見逃しているもっと簡単な方法があるでしょうか? 次のような単純なもので、%f解決されたシンボリックリンクのターゲットはどこにあるでしょうか:

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

これは次の例よりも簡単そうです:

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

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

ありがとう!

答え1

いいえ、systemd にはこれに対応する組み込み機能はありません。

Upstart の場合と同様に、シェルを呼び出す必要があります。

関連情報