简体   繁体   中英

Perl code doesn't run in a bash script with scheduling of crontab

I want to schedule my Perl code to be run every day at a specific time. so I put the below code in bash file:

Automate.sh

    #!/bin/sh
    perl /tmp/Taps/perl.pl

The schedule has been specified in below path:

10 17 * * * sh /tmp/Taps/Automate.sh > /tmp/Taps/result.log

When the time arrived to 17:10 the.sh file hasn't been running. however, when I run./Automate.sh (manually) it is running and I see the result. I don't know what is the problem.

Perl Code

#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;
use XML::Dumper;
use TAP3::Tap3edit;
$Data::Dumper::Indent=1;
$Data::Dumper::Useqq=1;
my $dump = new XML::Dumper;
use File::Basename;


my $perl='';
my $xml='';
my $tap3 = TAP3::Tap3edit->new();

   foreach my $file(glob '/tmp/Taps/X*')
   {
   $files= basename($file);
   $tap3->decode($files) || die $tap3->error;
    }

my $filename=$files.".xml\n";
$perl = $tap3->structure;
$dump->pl2xml($perl, $filename);
print "Done \n";

error:

No such file or directory for file X94 at /tmp/Taps/perl.pl line 22.
X94.xml

foreach my $file(glob 'Taps/X*') -- when you're running from cron, your current directory is / . You'll want to provide the full path to that Taps directory. Also specify the output directory for Out.xml

Cron uses a minimal environment and a short $PATH , which may not necessarily include the expected path to perl . Try specifying this path fully. Or source your shell settings before running the script.

There are a lot of things that can go wrong here. The most obvious and certain one is that if you use a glob to find the file in directory "Taps", then remove the directory from the file name by using basename , then Perl cannot find the file. Not quite sure what you are trying to achieve there. The file names from the glob will be for example Taps/Xfoo , a relative path to the working directory. If you try to access Xfoo from the working directory, that file will not be found (or the wrong file will be found).

This should also (probably) lead to a fatal error, which should be reported in your error log. (Assuming that the decode function returns a false value upon error, which is not certain.) If no errors are reported in your error log, that is a sign the program does not run at all. Or it could be that decode does not return false on missing file, and the file is considered to be empty.

I assume that when you test the program, you cd to /tmp and run it, or your "Taps" directory is in your home directory. So you are making assumptions about where your program looks for the files. You should be certain where it looks for files, probably by using only absolute paths.

Another simple error might be that crontab does not have permission to execute the file, or no read access to "Taps".

Edit:

Other complications in your code:

  • You include Data::Dumper , but never actually use that module.
  • $xml variable is not used.
  • $files variable not declared (this code would never run with use strict )
  • Your $files variable is outside your foreach loop, which means it will only run once. Since you use glob I assumed you were reading more than one file, in which case this solution will probably not do what you want. It is also possible that you are using a glob because the file name can change, eg X93 , X94 , etc. In that case you will read the last file name returned by the glob. But this looks like a weak link in your logic.
  • You add a newline \n to a file name, which is strange.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM