问题
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.
Set the
PERL5LIBenvironment variable15 15 * * 1-5 PERL5LIB=/root/perl5/lib/perl5 /usr/local/bin/perl my_script.plUse the
-Icommand line switch15 15 * * 1-5 /usr/local/bin/perl -I/root/perl5/lib/perl5 my_script.plUse the
libpragma 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