【问题标题】:Environment variables with daemon带有守护进程的环境变量
【发布时间】:2017-03-13 22:47:52
【问题描述】:

我目前正在尝试正确设置守护程序以在远程计算机上运行任务。问题是,我可以正确地手动启动命令,但是当它由守护程序启动时,它将无法工作,因为尚未设置环境变量。

在手动使用我的命令之前,我必须这样做:

sudo -s 
export HOME=/home/tim
cd ~
export PERL5LIB=/usr/local/my/lib
export PATH=/my/path/to/tools/bin

然后我运行我的命令。所以我怀疑如果守护进程没有设置它,它将无法工作。我怎样才能用守护进程做到这一点或摆脱依赖?

也许有一个临时文件夹?不确定。

【问题讨论】:

  • cmd 更改为bash -c cmd(假设这些环境变量由.bash_profile 设置)。
  • 这是一个非常受限的 PATH;无法访问/bin/usr/bin 有点不寻常。你确定那是你想要的。此外,export HOME = /home/tim 行也不好; = 标志周围不应有空格。
  • 是的,你是对的,没有空间。当我“手动”编写该行时,我只是错误地添加了它们,是的,路径指向某个 /bin 文件夹
  • 你为什么要删除帖子?这是一个很好的问题(在“edited [time]”的链接下可以在修订版中看到和提供),这可能对其他人有用,正如良好的投票所证实的那样。我建议您恢复它并保留它。

标签: perl dependencies export daemon


【解决方案1】:

%ENV 允许访问和操作环境变量。见Environment in perlrun。 (为了方便,还有一个核心模块Env。)有了它,我们可以说print $ENV{HOME},或者通过设置新的哈希键来添加环境变量,或者改变(写入新的)现有的值。该环境由程序启动的进程继承。

父母也是这样

use warnings 'all';
use strict;

$ENV{VAR}      = '...';  # HOME, PATH, ... or a new variable
$ENV{PERL5LIB} = '...';  # where some modules are installed

system("script.pl");

被调用的程序script.pl

use warnings 'all';
use strict;
use SomeModule qw(func);  # SomeModule is installed in path in PERL5LIB

print "$ENV{VAR}\n";
func();

可以使用$ENV{VAR},也可以直接在PERL5LIB设置的路径下安装use模块。

这仅影响您的程序启动的进程。它不会改变其父级的环境(守护程序无论如何都不会改变),并且对独立于您的程序的事物没有影响。

我想补充一点——确保你有一个正确的守护进程正在运行。例如,参见Complete Dissociation of Child from Parent in perlipc。也可以看in perlipc 如何使用SIGHUP

【讨论】:

  • @Alex 我通过将文字解释拆分为代码示例来编辑答案
  • 谢谢,帮了大忙!但是最后一件事,我在我的系统上安装了一个包包,它允许我运行这样的命令:“bundle /my/path [some options]”所以我告诉我的守护进程使用这个“bundle”命令,但是它告诉我它找不到命令“bundle”..你知道可能出了什么问题吗?
  • @Alex 从 shell 运行时,bundle 位于 shell 配置中定义的某个标准路径中。从脚本中,您可以运行bundle,这样它就会涉及到shell——然后您可以使用PATH,但如果绕过shell,它就不会。在脚本中,我喜欢指定要运行的程序的完整路径,所以/path/to/bundle/bundle ...
猜你喜欢
  • 2010-10-19
  • 2020-05-04
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多