Perl can't find module when run from cron.daily

喜你入骨 提交于 2019-11-30 05:30:02

问题


I have perl programs that use Net::Finger and have run successfully from cron.daily in Fedora 11.
I just upgraded a server to Fedora 18 and these same perl programs no longer run from cron but run fine from command line when logged in as root.
The error is:

Can't locate Net/Finger.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .)

The path to the module is /root/perl5/lib/perl5/Net/Finger.pm but I can't figure out how to add the path without causing more errors. Thanks in advance.


回答1:


See perlfaq8.

Here are three ways to add arbitrary directories to Perl's module search path.

  1. Set the PERL5LIB environment variable

    15 15 * * 1-5 PERL5LIB=/root/perl5/lib/perl5 /usr/local/bin/perl my_script.pl
    
  2. Use the -I command line switch

    15 15 * * 1-5 /usr/local/bin/perl -I/root/perl5/lib/perl5 my_script.pl
    
  3. Use the lib pragma inside your perl script

    #! /usr/local/bin/perl
    # my_script.pl: the script that does my thing
    use lib '/root/perl5/lib/perl5';
    use Net::Finger;
    ...
    

Also note that the environment of a cron job is much sparser than the environment of your command line, and in particular the cron environment's $PATH variable might not be what you expect. If you're not specifying the full path to the Perl executable, verify what $PATH the cron environment is using and make sure you are running the right version of perl.




回答2:


What happens if you add this to the top of the script?

#!/usr/bin/perl
use lib "/root/perl5/lib/perl5/Net";

Was this previously set in the .profile?

This is from a ubuntu thread, but may be related: https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work *Cron passes a minimal set of environment variables to your jobs. To see the difference, add a dummy job like this:

* * * * * env > /tmp/env.output*

I don't have a linux box handy at the moment, but I would try to see what's different in the @INC by running the following logged in as root and trying to set up a job to see what the crontab has. The env output above may indicate a different shell is being used by crontab, than what you may have set when logging in as root.

log in as root and run:

perl -le 'print for @INC'

set up a cron job to see the differences. I'm not sure if this syntax will work, but you could put the command in a simple pl script.

* * * * * perl -le 'print for @INC' > /tmp/inc.output

do the same for env



来源:https://stackoverflow.com/questions/17194632/perl-cant-find-module-when-run-from-cron-daily

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!