繁体   English   中英

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

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

我想安排我的 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 文件还没有运行。 但是,当我运行./Automate.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";

错误:

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

foreach my $file(glob 'Taps/X*') - 当您从 cron 运行时,您的当前目录是/ 您需要提供该 Taps 目录的完整路径。 还要为Out.xml指定output目录

Cron 使用一个最小的环境和一个简短的$PATH ,它可能不一定包含到perl的预期路径。 尝试完全指定此路径。 或者在运行脚本之前获取您的source设置。

go 这里有很多东西可以错。 最明显和确定的是,如果您使用 glob 在目录“Taps”中查找文件,然后使用basename将目录从文件名中删除,则 Perl 无法找到该文件。 不太确定您要在那里实现什么。 来自 glob 的文件名将是例如Taps/Xfoo ,工作目录的相对路径。 如果您尝试从工作目录访问Xfoo ,将找不到该文件(或者会找到错误的文件)。

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

我假设当您测试该程序时,您cd/tmp并运行它,或者您的“Taps”目录位于您的主目录中。 所以你正在假设你的程序在哪里寻找文件。 您应该确定它在哪里寻找文件,可能只使用绝对路径。

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

编辑:

您的代码中的其他并发症:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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