【发布时间】:2017-01-31 17:37:14
【问题描述】:
我的同事使用 perlbrew 编写了一个名为“Newlands”的 Dancer psgi 应用程序。我正在尝试使用 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 或类似的东西,但我知道这是不可能的。
有什么建议吗?谢谢!
【问题讨论】:
-
Re "没有一个与 perlbrew 相关的环境变量被正确设置",
perlbrew有两个用途,1)perl安装程序的包装器,以及2) 一个 PATH 操作工具。这些都不应该在这里相关。 -
Re "因此,当@INC 在库实际所在的
/home/newlands/.perlbrew/libs/perl-5.20.1@newlands处不包含任何内容时,我最终会遇到错误,指出在@INC 中找不到缺少的库。 “,呃,这不是perlbrew-installedperl构建安装库的地方。您似乎已经覆盖了安装位置?如果是这样,您将在脚本中使用use lib ...,或设置PERL5LIB环境变量。 (这些事情都与perlbrew无关。事实上,perlbrew通常用于避免做这些事情!) -
实际上,您尝试执行的操作有效,但前提是您将其拆分为两个服务。原因是
EnvironmentFile似乎在ExecStartPre命令执行之前被读取。因此,如果您创建另一个名为myapp_env.service的Type=oneshot服务来生成您的环境文件,并在myapp.service中的Unit部分中添加Requires=app_env.service和After=app_env.service,您应该很高兴。如果 perlbrew 应用程序将是source $PERLBREW_ROOT/etc/bashrc然后通过管道输出printenv以生成您的文件。
标签: perl systemd dancer perlbrew