我的同事写了一个名为" Newlands"的舞者psgi应用程序。利用perlbrew。我试图让应用程序启动系统启动使用systemd。我有这个服务文件:
[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
但是,即使使用ExecStartPre技巧(我从http://tech.akom.net/archives/93-Getting-a-systemd-unit-to-read-your-.bashrc-file-for-its-environment.html获得,修改后不使用--login选项),也没有正确设置与perlbrew相关的环境变量。因此,当@INC在/home/newlands/.perlbrew/libs/perl-5.20.1@newlands中包含任何库时,我最终会发现错误,表明在@INC中找不到丢失的库。< / p>
似乎/tmp/newlands.environment的输出文件仍然与&#34; env&#34;的输出显着不同。当实际以newlands用户身份登录时。我想提供/ opt / perlbrew / etc / bashrc或类似的东西,但我知道这是不可能的。
任何提示?谢谢!
答案 0 :(得分:2)
解决方案不是盲目地将您的Bash CLI环境转储到您的systemd环境中,解决方案是了解您需要的环境变量并设置它们。
正如@ikegami指出的,您的问题可能与PERL5LIB
环境变量有关。因此,从CLI运行您的应用程序并转储$ENV{PERL5LIB}
的值以查看应用程序所期望的值,然后在systemd
中设置该值。您可能需要使用其他变量重复该过程。
结果将是一个清晰且精确定义的systemd
环境,无论您.bashrc
的修改方式如何,都会以稳定一致的方式运行您的应用。