Ich habe mehrere verschiedene Projekte, die bereits Upstart-Dienste enthalten, und implementiere den Ansatz, diese Dienste /etc/init
direkt 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.service
mir erlaubt,Behalte meine Servicedefinition in der SVN-Arbeitskopie. Das einzige, was mir derzeit fehlt, ist, meinen readlink
Ansatz 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 readlink
dort 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 readlink
Ansatz extern implementieren.
Aber gibt es etwas Einfacheres, das ich übersehe? Etwas Einfaches wie das Folgende, wo %f
das 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.