perlbrew 应用程序的系统服务?

systemd service for a perlbrew application?

我的同事编写了一个名为 "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 相关的环境变量的 none 也得到了正确设置。因此,当@INC 在 /home/newlands/.perlbrew/libs/perl-5.20.1@newlands 中不包含任何内容时,我最终得到错误指示在@INC 中找不到缺少的库。

似乎 /tmp/newlands.environment 的输出文件与实际以 newlands 用户登录时 "env" 的输出文件仍有很大差异。我想采购 /opt/perlbrew/etc/bashrc 或类似的东西,但我知道那是不可能的。

有什么建议吗?谢谢!

解决方案不是盲目地将您的 Bash CLI 环境转储到您的 systemd 环境中,解决方案是了解您需要哪些环境变量并设置它们。

正如@ikegami 指出的那样,您的问题可能与 PERL5LIB 环境变量有关。所以 运行 你的应用程序从 CLI 中转出 $ENV{PERL5LIB} 的值以查看应用程序期望的值,然后在 systemd 中设置它。您可能需要使用其他变量重复该过程。

结果将是一个明确且精确定义的 systemd 环境,它将 运行 您的应用以稳定一致的方式运行,无论您的 .bashrc 如何修改。