如何解决Perl代码无法在具有crontab调度的bash脚本中运行
我想安排我的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的输出目录
Cron使用最小的环境和简短的$PATH
,这不一定包含到perl
的预期路径。尝试完全指定此路径。或在运行脚本之前source
设置外壳程序。
这里有很多事情可能出错。最明显和确定的是,如果使用glob在目录“ Taps”中找到文件,然后使用basename
从文件名中删除该目录,则Perl将找不到该文件。不太确定您要达到的目标。例如,来自全局的文件名将是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
,这很奇怪。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。