2013-06-16 7 views
0

J'ai écrit un script perl test.pl qui utilise un sous-programme écrit dans un autre fichier testant .pm. Je suis en mesure d'exécuter ce script avec succès manuellement, mais quand je lance le même script sur crontab, je reçois l'erreur suivante
Can't locate testing.pm in @INC
J'ai changé les autorisations des deux fichiers d'autorisation d'exécution et utilisé "use testing" en haut du script. Comment puis-je exécuter le script avec succès sur crontab.Comment exécuter un script perl sur crontab

Crontab : */2 * * * * PERL5LIB=$PERL5LIB:/home/test/testing.pm /home/test/test.pl > /home/test/test.log 2>&1

**

test.pl 
#!/usr/bin/perl -w 
use DBI; 
use warnings; 
use Time::Piece; 
use HTML::Entities; 
use lib '/home/test'; 
use testing 
# Connecting to the database # 
my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost;mysql_socket=/var/run/mysqld/mysqld.sock","root","password", {'RaiseError' => 1}); 
# my $dob = '2009-04-21 00:00:00'; 
my $dob = '2009-04-22 00:00:00'; 
#my $dob = localtime->strftime('%Y-%m-%d %H:%M:%S'); 
print "\ndob : $dob\n"; 
$name="test"; 
$number=1; 
$email="[email protected]" 
$id="123"; 
if ($mail==0) 
{ 
send_msg(0,$name,$number,$email,$aid); 
} 
if ($sms==0) 
{ 
send_msg(1,$name,$number,$email,$id); 
} 
} 
sub send_msg { 
    my ($type,$name,$number,$email,$id) = @_; 
    $sql7 = "select Sms,email from settings where Id='$id'"; 
    $sth7 = $dbh->prepare($sql7); 
    $sth7->execute 
    or die "SQL Error: $DBI::errstr\n"; 
    my ($sms,$email)=$sth7->fetchrow_array(); 
    my $xml=testing::xml($type,$name,$number,$email,$sms,$email);  
} 

**

+1

Ceci est un sous-ensemble de la question à http://stackoverflow.com/questions/753670/why-cant-my-perl-script-load-a-module-when-run-by-cron?rq=1 – amon

+0

juste une suggestion 'use strict;' – Ganesh

+0

@Ganesh use strict - Comment cela affecte-t-il l'exécution sur crontab – Rudra

Répondre

5

Vous devez dire à votre binaire Perl où chercher testing.pm. Vous pouvez le faire dans votre crontab:

0 * * * * PERL5LIB=$PERL5LIB:/directory/where/testing.pm/lives perl myperlscript.pl 

Ou vous pouvez le faire dans votre script .pl en utilisant use lib:

#!/usr/bin/perl 
use strict; 
use warnings; 
use lib '/directory/where/testing.pm/lives'; 
... 

Mise à jour:

Votre question éditée montre plusieurs problèmes:

  1. Votre crontab dit PERL5LIB=$PERL5LIB:/home/test/testing.pm. Vous devez ajouter le répertoire à PERL5LIB pas le chemin d'accès au fichier. La version correcte serait: `PERL5LIB = $ PERL5LIB:/home/test '.

  2. Votre test.pl indique use testing. Il n'y a aucun point-virgule à trouver après testing.

+0

Toujours la même erreur – Rudra

+0

Je reçois la même erreur – Rudra

+0

Puis retournez à votre question, éditez la question et montrez-nous du code: A quoi ressemble votre crontab? Comment ressemble votre 'test.pl'? – innaM

0

Avez-vous testing.pm dans votre tableau @INC? Sinon, vous pouvez add paths à @INC par la variable d'environnement PERL5LIB:

env PERL5LIB=/path/to/testing.pm perl test.pl 

Ou utilisez le module lib avec un autre chemin - use lib qw#/path/to/testing.pm#; - en haut de votre script. Espérons que vous triez ...

1

Il existe une variété de façons de résoudre ce problème. Ma préférence serait de garder simple et ajouter le crontab quelque chose comme:

use FindBin qw($Bin); 
use lib "$Bin/../lib"; 

Cela suppose que le fichier de bibliothèque est dans une relation fixe avec le script perl. L'exemple provient de documentation for the FindBin module.

Questions connexes