我目前正在尝试正确设置守护程序以在远程计算机上运行任务。问题是,我可以正确地手动启动该命令,但是当它由守护进程启动时,它不会工作,因为环境变量尚未设置。
在手动使用我的命令之前,我必须执行以下操作:
sudo -s
export HOME=/home/tim
cd ~
export PERL5LIB=/usr/local/my/lib
export PATH=/my/path/to/tools/bin
然后我运行我的命令。所以我怀疑如果守护进程没有设置这个它就不会工作。我如何使用守护进程来做到这一点或摆脱依赖关系?
也许有一个临时文件夹?不确定。
最佳答案
%ENV
允许访问和操作环境变量。请参阅Environment in perlrun 。 (为了方便起见,还有一个核心模块 Env。)有了它,我们可以说 print $ENV{HOME}
,或者通过设置新的哈希键来添加环境变量,或者更改(写入新)值对于现有的。该环境由程序启动的进程继承。
parent 也是如此
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
设置的路径中的模块。
这仅影响您的程序启动的进程。它不会改变其父进程的环境(守护进程不会有这种情况),并且对独立于程序的事物没有影响。
我想补充一点 - 确保您有一个正确的守护进程正在运行。例如,参见 Complete Dissociation of Child from Parent in perlipc 。您还可以查看in perlipc
如何使用SIGHUP
。
关于perl - 守护进程的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40349189/