Perl代码不会在带有crontab调度的bash脚本中运行

Perl代码不会在带有crontab调度的bash脚本中运行,bash,shell,perl,cron,Bash,Shell,Perl,Cron,我想安排我的Perl代码每天在特定的时间运行。因此,我将以下代码放在bash文件中: Automate.sh #!/bin/sh perl /tmp/Taps/perl.pl 计划已在以下路径中指定: 10 17 * * * sh /tmp/Taps/Automate.sh > /tmp/Taps/result.log 当时间到达17:10时,.sh文件尚未运行。但是,当我手动运行./automation.sh时,它正在运行,我看到了结果。我不知道是什么问题 Perl

我想安排我的Perl代码每天在特定的时间运行。因此,我将以下代码放在bash文件中:

Automate.sh

    #!/bin/sh
    perl /tmp/Taps/perl.pl
计划已在以下路径中指定:

10 17 * * * sh /tmp/Taps/Automate.sh > /tmp/Taps/result.log
当时间到达17:10时,.sh文件尚未运行。但是,当我手动运行./automation.sh时,它正在运行,我看到了结果。我不知道是什么问题

Perl代码

#!/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";
错误:


Cron使用一个最小的环境和一个短的$PATH,这可能不一定包括预期的perl路径。尝试完全指定此路径。或者在运行脚本之前获取shell设置的源代码。

Cron使用最小的环境和短的$PATH,这可能不一定包括预期的perl路径。尝试完全指定此路径。或者在运行脚本之前,先获取shell设置的源代码。

foreach my$fileglob“Taps/X*”-从cron运行时,当前目录为/。您需要提供该目录的完整路径。还为Out.xml指定输出目录

foreach my$fileglob'Taps/X*'-当您从cron运行时,当前目录为/。您需要提供该目录的完整路径。还要为Out.xml指定输出目录这里有很多可能出错的地方。最明显也是最确定的一点是,如果您使用glob在目录点击中查找文件,然后使用basename从文件名中删除目录,那么Perl将无法找到该文件。不太清楚你在那里想要达到什么。glob中的文件名将是例如Taps/Xfoo,一个指向工作目录的相对路径。如果试图从工作目录访问Xfoo,则将找不到该文件或找到错误的文件

这也可能导致致命错误,应该在错误日志中报告。假设decode函数在出错时返回假值,这是不确定的。如果错误日志中没有报告错误,则表明程序根本没有运行。或者,对于丢失的文件,decode不会返回false,并且该文件被认为是空的

我假设当您测试程序时,您可以将cd刻录到/tmp并运行它,或者您的Taps目录位于您的主目录中。因此,您正在对程序查找文件的位置进行假设。您应该确定它在哪里查找文件,可能只使用绝对路径

另一个简单的错误可能是crontab没有执行文件的权限,或者没有对Taps的读取权限

编辑:

代码中的其他复杂性:

您包括Data::Dumper,但从未实际使用该模块。 未使用$xml变量。 $files变量未声明此代码永远不会使用use strict运行 $files变量在foreach循环之外,这意味着它只运行一次。由于您使用glob,我假设您正在读取多个文件,在这种情况下,此解决方案可能无法满足您的需要。您使用glob也可能是因为文件名可能会更改,例如X93、X94等。在这种情况下,您将读取glob返回的最后一个文件名。但这似乎是你逻辑中的薄弱环节。 在文件名中添加换行符\n,这很奇怪。
这里有很多事情可能会出错。最明显也是最确定的一点是,如果您使用glob在目录点击中查找文件,然后使用basename从文件名中删除目录,那么Perl将无法找到该文件。不太清楚你在那里想要达到什么。glob中的文件名将是例如Taps/Xfoo,一个指向工作目录的相对路径。如果试图从工作目录访问Xfoo,则将找不到该文件或找到错误的文件

这也可能导致致命错误,应该在错误日志中报告。假设decode函数在出错时返回假值,这是不确定的。如果错误日志中没有报告错误,则表明程序根本没有运行。或者,对于丢失的文件,decode不会返回false,并且该文件被认为是空的

我假设当您测试程序时,您可以将cd刻录到/tmp并运行它,或者您的Taps目录位于您的主目录中。因此,您正在对程序查找文件的位置进行假设。您应该确定它在哪里查找文件,可能只使用绝对路径

另一个简单的错误可能是crontab没有执行文件的权限,或者没有对Taps的读取权限

编辑:

代码中的其他复杂性:

您包括Data::Dumper,但从未实际使用该模块。 未使用$xml变量。 $files变量未声明此代码永远不会使用use strict运行 $files变量在foreach循环之外,这意味着它只运行一次。由于您使用glob,我假设您正在读取多个文件,在这种情况下 解决方案可能不会满足您的需要。您使用glob也可能是因为文件名可能会更改,例如X93、X94等。在这种情况下,您将读取glob返回的最后一个文件名。但这似乎是你逻辑中的薄弱环节。 在文件名中添加换行符\n,这很奇怪。

我做了,但它没有运行,我有一个空的日志file@Saher:cron应该通过邮件向您发送stderr。因此,您应该会收到一些错误消息。或者,您可以执行2>&1并在result.log中收集stderr。我也会将-x与sh一起使用。然后,日志文件至少不能再为空。我将指定sh和perl.Create crontab job的完整路径,在其中放置命令env>/tmp/env_data,运行crontab后,您将看到crontab中设置的所有变量。man crontab提供了足够的信息来理解运行程序所需的设置。为什么要使用basename?考虑如果您的PWD是/$文件没有在您所显示的代码中声明的任何地方会发生什么。使用use strict时,此代码将产生致命错误全局符号$files requires explicit package。我这样做了,但它没有运行,并且日志为空file@Saher:cron应该通过邮件向您发送stderr。因此,您应该会收到一些错误消息。或者,您可以执行2>&1并在result.log中收集stderr。我也会将-x与sh一起使用。然后,日志文件至少不能再为空。我将指定sh和perl.Create crontab job的完整路径,在其中放置命令env>/tmp/env_data,运行crontab后,您将看到crontab中设置的所有变量。man crontab提供了足够的信息来理解运行程序所需的设置。为什么要使用basename?考虑如果您的PWD是/$文件没有在您所显示的代码中声明的任何地方会发生什么。使用use strict时,此代码将产生致命错误全局符号$files requires explicit package。在crontab中指定的文件命名不完整?我使用了短路径,但结果没有改变!我的意思是使用/path/to/perl而不仅仅是perl。文件X94在/tmp/Taps/perl.pl第22行没有这样的文件或目录。X94.XmlCrontab中指定的文件命名不完整?我使用了短路径,但结果没有改变!我的意思是使用/path/to/perl而不仅仅是perl。文件X94在/tmp/Taps/perl.pl第22行没有这样的文件或目录。X94.xmlI如上所述修改了我的代码,现在我得到了上面的错误:在/tmp/Taps/perl.pl第22行,X94文件没有这样的文件或目录。X94.xmlI如上所述修改了我的代码,现在我得到了上面的错误:在/tmp/Taps/perl.pl第22行,X94文件没有这样的文件或目录。X94.xmlI尝试进行相关更改并修改代码。但我得到了上面显示的错误。没有这样的文件或目录错误可能是因为您在相对文件名上使用了basename,如我所解释的。我试图进行相对更改并修改代码。但我得到了上面显示的错误。没有这样的文件或目录错误可能是因为您在相对文件名上使用了basename,如我所解释的。
No such file or directory for file X94 at /tmp/Taps/perl.pl line 22.
X94.xml