我有一台服务器,我已经安装了一些perl模块。我通过CPAN安装了前几个,即perl -MCPAN -e'安装Module :: Name'作为非root用户。
然后我遇到了一些问题,刚开始通过sudo或root安装它们。
我昨晚通过cron作业的一些输出发现,有些脚本失败了,因为他们无法在@INC数组中找到模块。
我发现在相关服务器上,perl -V显示以下内容:
以root身份:
%ENV:
PERL5LIB="/root/perl5/lib/perl5:"
PERL_LOCAL_LIB_ROOT=":/root/perl5"
PERL_MB_OPT="--install_base /root/perl5"
PERL_MM_OPT="INSTALL_BASE=/root/perl5"
@INC:
/root/perl5/lib/perl5/x86_64-linux-thread-multi
/root/perl5/lib/perl5
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
以及作为非root用户:
%ENV:
PERL5LIB="/home/user/perl5/lib/perl5:"
PERL_LOCAL_LIB_ROOT=":/home/user/perl5"
PERL_MB_OPT="--install_base /home/user/perl5"
PERL_MM_OPT="INSTALL_BASE=/home/user/perl5"
@INC:
/home/user/perl5/lib/perl5/x86_64-linux-thread-multi
/home/user/perl5/lib/perl5
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
我检查了另一台服务器,其中perl模块的安装从未出现过问题,并且它显示相同的输出,无论是以非root用户还是root运行,并且只有@INC,没有$ ENV定义。
@INC:
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
所以我的问题是,如何在服务器上配置CPAN我遇到问题,因为不同的用户没有不同的环境和@INC值。我更确切地说它只有一个可由所有人访问的perl模块的默认系统位置。我假设我需要从CPAN shell运行o conf init,或直接编辑/root/.cpan/CPAN/MyConfig.pm和/home/user/.cpan/CPAN/MyConfig,但不太确定我需要哪些精确的编辑制作。
谢谢,
答案 0 :(得分:0)
因为cron任务可以被定义为" system"相关的我会像@ikegami建议并坚持使用系统perl并使用包管理器来保持用户之间的环境一致。最好将 root 和/root
排除在外:如果 root 正在安装到他们的$ HOME,那么您也可以使用系统包
如果您要为cron
创建自定义脚本并以用户身份运行它们,那么您可以使用perlbrew
,local::lib
为该用户创建一致的perl环境(或多个)你似乎已经安装了)和cpanminus
(可以与perlbrew
一起安装并与之无缝地工作)。
作为快速解决方案,您可以使用@INC
扩展您的-I
(但非root用户显然无法访问/root
)和%ENV
与其他开关和环境变量。有关其中的一些内容,请参阅perlrun
- 例如:
-Idirectory
-I指定的目录前置于模块的搜索路径(@INC
)。