Wie vermeidet man einen absoluten Pfad zu einer ausführbaren Datei in systemd?

Wie vermeidet man einen absoluten Pfad zu einer ausführbaren Datei in systemd?

Ich habe mehrere verschiedene Projekte, die bereits Upstart-Dienste enthalten, und implementiere den Ansatz, diese Dienste /etc/initdirekt aus einer SVN-Arbeitskopie als symbolischen Link einzubinden. Upstart bietet eingebettete Skripte, mit denen ich einfach das Ziel meines symbolischen Links lesen und zusätzliche Skripte oder die ausführbare Datei des Dienstes selbst ausführen kann. Für mein Setup ist nur die folgende Zeile wichtig:

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

Auf diese Weise muss ich keinen absoluten Pfad zu meinen Arbeitskopien fest codieren, sondern kann mich einfach auf den Symlink und ein definiertes relatives Verzeichnislayout meiner verschiedenen Projekte verlassen. Ich möchte denselben Ansatz für systemd implementieren, mich aber so weit wie möglich an die vorgeschlagenen Konzepte halten, die eingebettete Skripte anscheinend nicht so unterstützen, wie ich sie früher verwendet habe.

Ich weiß bereits, dass es systemctl enable /usr/local/.../someApp.servicemir erlaubt,Behalte meine Servicedefinition in der SVN-Arbeitskopie. Das einzige, was mir derzeit fehlt, ist, meinen readlinkAnsatz richtig anzupassen, damit ich keinen absoluten Pfad hart codieren muss. Ich habe gelesen überSpezifiziererbereits, aber meines Wissens stellen sie keine absoluten Pfade bereit und lösen keine symbolischen Links auf.

Darüber hinaus kann ich Shells mit einer zusätzlichen Kommandozeile direkt ausführen und readlinkdort theoretisch meinen Ansatz einbetten. Das sieht aber hässlich aus.

Ein anderer Ansatz, der mir in den Sinn kommt, ist ein systemweites Dispatcher-Skript. Ich habe bereits einige systemweite Skripte /usr/local/vendor, an die ich Spezifizierer weiterleiten könnte und die meinen readlinkAnsatz extern implementieren.

Aber gibt es etwas Einfacheres, das ich übersehe? Etwas Einfaches wie das Folgende, wo %fdas aufgelöste Symlink-Ziel wäre:

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

Das scheint einfacher zu sein als die folgenden Beispiele:

ExecStart = /bin/sh -c "…"

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

Danke!

Antwort1

Nein, systemd hat hierfür keine integrierte Funktion.

Genau wie bei Upstart müssen Sie eine Shell aufrufen.

verwandte Informationen