我的同事写了一个名为“Newlands”的Dancer 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中找不到丢失的库.
似乎在实际以newlands用户身份登录时,/ tmp / newlands.environment中的输出文件仍然与“env”的输出显着不同.我想要/ opt / perlbrew / etc / bashrc或类似的东西,但我明白这是不可能的.
有小费吗?谢谢!
最佳答案 解决方案不是盲目地将您的Bash CLI环境转储到您的systemd环境中,解决方案是了解您需要的环境变量并设置它们.
正如@ikegami指出的那样,您的问题可能与PERL5LIB环境变量有关.因此,从CLI运行您的应用程序并转出$ENV {PERL5LIB}的值以查看应用程序期望的值,然后在systemd中设置该值.您可能需要使用其他变量重复该过程.
结果将是一个清晰且精确定义的系统环境,无论您的.bashrc如何被修改,它都将以稳定一致的方式运行您的应用程序.