2015-01-08 61 views
1

我有一個服務器,我已經安裝了一些perl模塊。我通過CPAN安裝了前幾個,即perl -MCPAN -e'install Module :: Name'作爲非root用戶。perl cpan模塊安裝

然後我遇到了一些問題,並開始通過sudo或root安裝它們。

昨晚我通過cron作業的輸出發現了一些腳本失敗,因爲它們無法在@INC數組中找到模塊。

我發現有問題的服務器上,perl -V來顯示以下內容:

爲根:

%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用戶身份運行,只有@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 

所以我的問題是,我怎麼能我有問題,沒有針對不同用戶不同環境和@INC值在服務器上配置CPAN。我寧願它只有一個perl模塊的默認系統位置,所有人都可以訪問。我假設我需要從CPAN shell運行o conf init,或直接編輯/root/.cpan/CPAN/MyConfig.pm和/home/user/.cpan/CPAN/MyConfig,但不太確定我需要的確切編輯製造。

謝謝

+3

@INC中的大部分在構建時都被硬編碼到Perl中。 Env var像PERL5LIB被添加到它。 「cpan」與此無關。 – ikegami

+0

安裝它們的位置應該沒有關係,因爲它們將安裝到的路徑將位於'@ INC'中(除非您明確地覆蓋此位置)。 – ikegami

+0

請注意,您似乎正在使用系統Perl。你應該讓系統的軟件包管理器添加軟件包,而不是'cpan'。否則可能會有風險。 – ikegami

回答

0

由於後臺任務可以被定義爲「系統」 @ikegami建議,並堅持與系統Perl和使用軟件包管理器保持環境跨用戶一致的我會做相關的。最好保留根目錄/root不在圖片中:如果根目錄正在安裝到他們的$ HOME,那麼您可能只需使用系統軟件包。

如果是cron創建自定義腳本和運行它們的用戶,那麼你可以創建一個一致的Perl環境(或幾個)與perlbrew用戶,local::lib(你似乎已經安裝)和cpanminus(其可以安裝並與perlbrew無縫配合)。

作爲速戰速決,你可以擴展你的@INC-I(但非root用戶不會能夠訪問/root明顯)和你的%ENV與其他交換機和環境變量。對於其中的一些,參見perlrun - 例如:由-I指定

  • -Idirectory

    目錄預先計劃爲模塊的搜索路徑(@INC)。

+0

再一次,如果您提供的信息將具有價值,就需要更具體的說明。 – tman

+1

' -I'不添加拱門,IIRC。最好使用'PERL5LIB = ... script'或'perl -Mlib = ... script' – ikegami

+0

@ikegami - 你當然是對的。我忽略了考慮'XS'擴展等。更堅持使用供應商軟件包的更多理由。 –