【问题标题】:systemd service for a perlbrew application?perlbrew 应用程序的 systemd 服务?
【发布时间】: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-installed perl 构建安装库的地方。您似乎已经覆盖了安装位置?如果是这样,您将在脚本中使用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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 2018-10-04
    • 2022-07-08
    • 2012-11-30
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多