2017-01-31 5 views
3

Mein Kollege schrieb eine Dancer psgi-Anwendung namens "Newlands", die Perlbrew verwendet. Ich versuche, die Anwendung zum Systemstart mit Systemd zu starten. Ich habe diese Service-Datei:Systemdienst für eine Perlbrew-Anwendung?

[Unit] 
Description=Newlands 
After=network-online.target 

[Service] 
Type=forking 
User=newlands 
WorkingDirectory=/home/newlands/working/newlands 
PIDFile=/home/newlands/newlands.pid 
ExecStartPre=/bin/bash -c 'env > /tmp/newlands.environment' 
ExecStartPre=/bin/mkdir -p /tmp/newlands/newlands/session/ 
ExecStart=/usr/local/bin/starman --host 127.0.0.1 --listen :5000 --env production --preload-app --workers 12 --daemonize --error-log /var/log/newlands/newlands.error.log --pid /home/newlands/newlands.pid bin/newlandia.psgi 
EnvironmentFile=-/tmp/newlands.environment 
Restart=always 

[Install] 
WantedBy=multi-user.target 

Aber auch mit dem ExecStartPre Trick (was ich von http://tech.akom.net/archives/93-Getting-a-systemd-unit-to-read-your-.bashrc-file-for-its-environment.html bekam, veränderte nicht die --login Option), keine des perlbrew bezogenen Umgebungsvariablen richtig gesetzt zu werden. So habe ich am Ende mit Fehlern Anzeige- fehlende Bibliotheken nicht in @INC gefunden, wenn @INC nichts an /home/newlands/.perlbrew/libs/[email protected] enthalten, wo die Bibliotheken tatsächlich sind.

Es scheint, dass die ausgegebene Datei in /tmp/newlands.environment noch erheblich von der Ausgabe von "env" abweicht, wenn sie tatsächlich als Newlands-Benutzer angemeldet ist. Ich würde gerne/opt/perlbrew/etc/bashrc oder etwas ähnliches, aber ich verstehe, dass das nicht möglich ist.

Irgendwelche Tipps? Vielen Dank!

+1

Re "* keine der perlbrew-bezogenen Umgebungsvariablen werden richtig gesetzt *", 'perlbrew' dient zwei Zwecken, 1) einem Wrapper für ein' Perl'-Installer und 2) einem PATH-Manipulationstool. Keine davon sollte hier relevant sein. – ikegami

+1

Re "* Am Ende gibt es Fehler, die auf fehlende Bibliotheken hinweisen, die nicht in @INC gefunden wurden, wenn @INC nichts enthält in/home/newlands/.perlbrew/libs/perl-5.20.1 @ newlands, wo die Bibliotheken sind eigentlich sind. * ", uh, das ist nicht der Ort, an dem' perlbrew' -installed 'perl' Build-Bibliotheken installiert. Sie scheinen den Installationsort überschrieben zu haben? Wenn dies der Fall ist, verwenden Sie 'usage lib ...' innerhalb Ihres Skripts oder legen Sie die 'PERL5LIB' env var fest. (Keines dieser Dinge hat etwas mit 'Perlbrew' zu tun. In der Tat wird' Perlbrew' normalerweise verwendet um * diese Dinge zu vermeiden!) – ikegami

Antwort

2

Die Lösung besteht nicht darin, Ihre Bash CLI-Umgebung blind in Ihre Systemumgebung zu transferieren. Die Lösung besteht darin, zu verstehen, welche Umgebungsvariablen Sie benötigen und diese festzulegen.

Wie @ikegami darauf hinweist, hängt Ihr Problem wahrscheinlich mit der Umgebungsvariablen zusammen. Führen Sie Ihre App also über die Befehlszeilenschnittstelle aus und geben Sie den Wert $ENV{PERL5LIB} aus, um zu sehen, welchen Wert die App erwartet, und setzen Sie diesen Wert auf systemd. Möglicherweise müssen Sie den Prozess mit anderen Variablen wiederholen.

Das Ergebnis wird eine klar definierte systemd Umgebung sein, die Ihre App in einer stabilen und konsistenten Weise ausführen wird, unabhängig davon, wie Ihre .bashrc geändert wird.

Verwandte Themen