【问题标题】:Perl script not running at all in CrontabPerl 脚本在 Crontab 中根本没有运行
【发布时间】:2011-11-24 00:31:30
【问题描述】:

我正在尝试从 crontab 运行 perl 脚本,但遇到了困难。当我从命令行运行它时,它工作得很好。我已经搜索并看到了关于环境等的各种答案并指定了完整路径,但我不确定我是否做得正确。下面是脚本

#!/usr/bin/perl

$ENV{'PATH'} = '/usr/bin:/usr/sbin/usr/local/bin';

use strict;

my $TG_Stats_directory = "/export/home/SonusNFS/TG_Stats";

opendir TG_Stats, $TG_Stats_directory;

my @GSX_directories = readdir TG_Stats;

foreach my $subdir (@GSX_directories) {

        opendir GSX, $subdir;
        my @csv_listing = readdir GSX;
                foreach my $file (@csv_listing){
                        if ($file =~ /\.csv/){
                                unlink $TG_Stats_directory."/".$subdir."/".$file;
                        }               
                }
        close GSX;      

}       

close TG_Stats;

下面是 crontab 条目。

25 03 * * * /usr/bin/perl /export/home/SonusNFS/TG_Stats/rmdir.pl 2>/tmp/cronerrors.txt

我错过了什么?我需要添加什么才能让它在 Cron 中运行?

【问题讨论】:

  • 您的/tmp/cronerrors.txt 文件中有任何内容吗?
  • 什么情况下不运行?它从来没有被调用过吗?有错误吗?
  • 您可能希望将重定向更改为>> 而不是>,这样您就不会丢失旧错误。
  • 您的$ENV{'PATH'} 中缺少一个冒号,但这在这里不重要。你应该在你的目录句柄上使用closedir,而不是close
  • 此外,unlink 确实有一个您可能想要查看的有用返回值(如果 unlink 失败,则为 $!)。

标签: perl crontab


【解决方案1】:

看来我运行它的目录很重要。当我像这样从根运行它时:

# cd /
# perl /export/home/SonusNFS/TG_Stats/rmdir.pl

我得到了完全不同的结果:

# cd /export/home/SonusNFS/TG_Stats/
# perl rmdir.pl

考虑到这一点,我将其添加到脚本中:

my $directory = "/export/home/SonusNFS/TG_Stats";
chdir($directory) or die "Can't chdir to $directory $!";

它终于从 cron 运行了。即使我在第一个场景中指定了路径,仍然不明白为什么结果不同。

谢谢大家的回答。我的答案甚至不是真正的答案,只是一种解决方法

【讨论】:

    【解决方案2】:

    一些提示:

    > $ENV{'PATH'} = '/usr/bin:/usr/sbin/usr/local/bin';
    
    $ENV{PATH} = '/usr/bin:/usr/sbin:/usr/local/bin';
    
    > use strict;
    

    不要忘记警告:

    use warnings;
    
    > my $TG_Stats_directory = "/export/home/SonusNFS/TG_Stats";
    
    > opendir TG_Stats, $TG_Stats_directory;
    

    更好地使用词法 DIR 句柄:

    opendir my $TG_Stats... or die $!;
    
    > my @GSX_directories = readdir TG_Stats;
    

    你确实意识到'.'和“..”现在在您的列表中,是吗?

    my @GSX_directories = grep !/^\.\.?$/, readdir TG_Stats;
    
    > foreach my $subdir (@GSX_directories) {
    
    >     opendir GSX, $subdir;
    

    除非您当前的工作目录是 $TG_Stats_directory!否则这会失败:

    opendir my $GSX, "$TG_Stats_directory/$subdir" or die $!;
    
    >     my @csv_listing = readdir GSX;
    
    >             foreach my $file (@csv_listing){
    >                     if ($file =~ /\.csv/){
    

    您不是说以 .csv 结尾的文件吗?

                          if ( $file =~ /\.csv$/ ) {
    
    >                             unlink $TG_Stats_directory."/".$subdir."/".$file;
    >                     }               
                }
    >     close GSX;      
    
          closedir $GSX;
    > }       
    
    > close TG_Stats;
    
    closedir $TG_Stats;
    

    HTH, 保罗

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      相关资源
      最近更新 更多