Jos*_*erg 5 perl perlbrew dancer systemd
我的同事编写了一个名为“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
Run Code Online (Sandbox Code Playgroud)
然而,即使使用 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。您可能需要使用其他变量重复该过程。
结果将是一个清晰且精确定义的systemd环境,无论您的应用程序如何.bashrc修改,该环境都将以稳定且一致的方式运行您的应用程序。