【问题标题】:perl @INC not complete when launching lighttpd启动 lig​​httpd 时 perl @INC 未完成
【发布时间】:2020-08-21 05:41:27
【问题描述】:

我正在尝试在我的 iMac (Catalina 10.15.6) 上运行 TrinotateWeb (v3.2.1)。它使用轻量级浏览器 lighttpd (v1.4.55),它是我随 Homebrew 一起安装的。

启动服务器时,它抱怨在@INC 中找不到 HTML/Template.pm:

Can't locate HTML/Template.pm in @INC (you may need to install the HTML::Template module) 
(@INC contains: 
/Library/Perl/5.18/darwin-thread-multi-2level 
/Library/Perl/5.18 
/Network/Library/Perl/5.18/darwin-thread-multi-2level 
/Network/Library/Perl/5.18 
/Library/Perl/Updates/5.18.4 
/System/Library/Perl/5.18/darwin-thread-multi-2level 
/System/Library/Perl/5.18 
/System/Library/Perl/Extras/5.18/darwin-thread-multi-2level 
/System/Library/Perl/Extras/5.18 
.) at /Applications/Trinotate-v3.2.1/TrinotateWeb/cgi-bin/index.cgi line 15.
BEGIN failed--compilation aborted at 
/Applications/Trinotate-v3.2.1/TrinotateWeb/cgi-bin/index.cgi line 15.

但是,HTML/Template.pm 很好地安装在文件夹/Users/simon/perl5/lib/perl5 中。它是使用cpan HTML::Template 安装的。

问题似乎源于@INC。

我的 .zshrc 配置文件使用 PERL5LIB 引用上述位置:

PATH="/Users/simon/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/Users/simon/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5L$
PERL_LOCAL_LIB_ROOT="/Users/simon/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB$
PERL_MB_OPT="--install_base \"/Users/simon/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/Users/simon/perl5"; export PERL_MM_OPT;

在终端中,@INC 包含 PERL5LIB 并因此链接 HTML/Template.pm:

➜  ~ perl -V
Summary of my perl5 (revision 5 version 18 subversion 4) configuration:
   
  Platform:
    osname=darwin, osvers=19.0, archname=darwin-thread-multi-2level
    uname='darwin osx397.sd.apple.com 19.0 darwin kernel version 18.0.0: tue jul 9 11:12:08 pdt 2019; root:xnu-4903.201.2.100.7~1release_x86_64 x86_64 '
    config_args='-ds -e -Dprefix=/usr -Dccflags=-g  -pipe  -Dldflags= -Dman3ext=3pm -Duseithreads -Duseshrplib -Dinc_version_list=none -Dcc=cc'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags =' -g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -fstack-protector',
    optimize='-Os',
    cppflags='-g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -fstack-protector'
    ccversion='', gccversion='4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc-selector-opts)', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector'
    libpth=/usr/lib /usr/local/lib
    libs= 
    perllibs=
    libc=, so=dylib, useshrplib=true, libperl=libperl.dylib
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=bundle, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags=' -bundle -undefined dynamic_lookup -fstack-protector'


Characteristics of this binary (from libperl): 
  Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS
                        PERL_DONT_CREATE_GVSV
                        PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
                        PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
                        PERL_PRESERVE_IVUV PERL_SAWAMPERSAND USE_64_BIT_ALL
                        USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
                        USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE
                        USE_LOCALE_NUMERIC USE_PERLIO USE_PERL_ATOF
                        USE_REENTRANT_API
  Locally applied patches:
    /Library/Perl/Updates/<version> comes before system perl directories
    installprivlib and installarchlib points to the Updates directory
  Built under darwin
  Compiled at Jun  5 2020 17:34:07
  %ENV:
    PERL5LIB="/Users/simon/perl5/lib/perl5"
    PERL_LOCAL_LIB_ROOT="/Users/simon/perl5"
    PERL_MB_OPT="--install_base "/Users/simon/perl5""
    PERL_MM_OPT="INSTALL_BASE=/Users/simon/perl5"
  @INC:
    /Users/simon/perl5/lib/perl5/5.18.4/darwin-thread-multi-2level
    /Users/simon/perl5/lib/perl5/5.18.4
    /Users/simon/perl5/lib/perl5/darwin-thread-multi-2level
    /Users/simon/perl5/lib/perl5
    /Library/Perl/5.18/darwin-thread-multi-2level
    /Library/Perl/5.18
    /Network/Library/Perl/5.18/darwin-thread-multi-2level
    /Network/Library/Perl/5.18
    /Library/Perl/Updates/5.18.4
    /System/Library/Perl/5.18/darwin-thread-multi-2level
    /System/Library/Perl/5.18
    /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
    /System/Library/Perl/Extras/5.18
    .

我不明白为什么在执行 lighttpd 时@INC 没有列出所有路径作为我上面显示的实际环境?

【问题讨论】:

  • lighttpd 是否由与 simon 不同的用户运行?也许它没有读取/Users/simon下文件的权限?
  • 我不熟悉 lighttpd,但我猜它是作为一项服务运行的,永远不会触及您的 .zshrc 文件?我更喜欢在我的主目录中安装整个 perl(例如使用 perlbrew)而不是仅安装模块(例如使用 local::lib) 的少数(但主要)原因之一
  • 你所说的模块安装路径不包含在@INC中,如报错信息所报告。因此 perl 看不到它。您选择将它安装在那里,而不是在常规的 perl 库中是有原因的吗? IE。 @INC 中列出的路径之一。
  • @DaveMitchell:lighttpd 在/Users/simon 下运行(另外,那台计算机上只有一个帐户),所以我认为这可能不是权限问题。 @TLP:路径确实不包括在内,但我想知道为什么会这样,因为它在perl -V 返回的@INC 中很好地列出了。没有特别的理由把它放在那里,只是自动使用cpan 的位置(第一次在这台机器上运行cpan)。 @ikegami:感谢您的建议。我将在星期一尝试使用 brew 安装另一个 perl。
  • @sihellem 对我来说听起来像是一个用户混淆(也许 webscripts 是由不同的用户运行的),或者你正在使用两个不同版本的 perl。但这不是我的专业领域。

标签: macos perl lighttpd


【解决方案1】:

lighttpd exec 直接是你的 CGI(或 FastCGI),所以如果你的脚本是 xxxxx.pl 并且包含 #!/usr/bin/perl,那就是执行的。 (更明确地说,不执行 zsh 并且不读取 .zshrc,正如其他人在 cmets 中所说的那样)

您可以更新这些脚本中的第一行以包含 #!/usr/bin/perl -I...,或者您可以修改 lighttpd.conf 以指定:

setenv.add-environment = ("PERL5LIB" =&gt; "...")

https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSetEnv

您也可以指示 mod_cgi 执行 zsh shell 脚本来执行 perl,但这样做速度较慢且效率较低。

cgi.assign = (".pl" =&gt; "/home/simon/bin/zsh-bounce-perl")

https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSetEnv

zsh-bounce-perl 脚​​本包含类似

#!/usr/bin/zsh
exec perl "$@"

【讨论】:

  • 我选择了最优雅的解决方案,即在lighttpd.conf 中设置setenv.add-environment = ("PERL5LIB" =&gt; "/Users/simon/perl5/lib/perl5")HTML/Template.pm 位于/Users/simon/perl5/lib/perl5 下。但是我仍然得到完全相同的错误。还有其他参数需要修改吗?
  • 如果 Perl 脚本启用了 -T(污点检查),那么 Perl 将忽略 PERL5LIB 和其他环境变量。我建议编写一个简单的 Perl 脚本,将环境反映给您,通过 Web 服务器访问脚本并查看输出。
  • 我也想过这个,但是/Applications/Trinotate-v3.2.1/TrinotateWeb/cgi-bin/index.cgi-T模式下没有执行。
  • 看起来您找到了解决方案(作为单独的答案发布)。我仍然很好奇您是否在更新 lighttpd.conf 后使用 test.pl 来查看 Perl 脚本是否看到 $ENV{PERL5LIB}。
  • 我刚刚修改了 lighttpd.conf 来测试它。 @INC 签名与我的答案中发布的签名相同,显示了正确的 PATH,但不在 $ENV{PERL5LIB}
【解决方案2】:

我再次验证了执行脚本/Applications/Trinotate-v3.2.1/TrinotateWeb/cgi-bin/index.cgi时使用的是哪个perl:#!/usr/bin/env perl

因此我执行了以下test.pl,其中包含:

#!/usr/bin/env perl
print $_, "\n" for @INC;

这很好地返回了HTML/Template.pm 所在的完整@INC:

➜  Desktop perl test.pl
/Users/simon/perl5/lib/perl5/5.18.4/darwin-thread-multi-2level
/Users/simon/perl5/lib/perl5/5.18.4
/Users/simon/perl5/lib/perl5/darwin-thread-multi-2level
/Users/simon/perl5/lib/perl5
/Library/Perl/5.18/darwin-thread-multi-2level
/Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/Network/Library/Perl/5.18
/Library/Perl/Updates/5.18.4/darwin-thread-multi-2level
/Library/Perl/Updates/5.18.4
/System/Library/Perl/5.18/darwin-thread-multi-2level
/System/Library/Perl/5.18
/System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.18
.

由于建议使用用户混合,我尝试使用 sudo cpan HTML::Template 以 root 权限安装软件包。该软件包安装在/Library/Perl/5.18

有了这个解决方法,lighttpd 现在可以完美运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多