【问题标题】:How to set a crontab job for a perl script如何为 perl 脚本设置 crontab 作业
【发布时间】:2012-04-08 15:17:51
【问题描述】:

我有一个 Perl 脚本,我想通过 cron 每 4 小时运行一次。但不知何故,如果我通过命令行运行它,它无法通过 cron 执行并且运行良好。以下是我在 crontab 中设置的命令:

perl -q /path_to_script/script.pl > /dev/null

另外,当我在命令提示符下运行此命令时,它不会执行,但是当我进入 path_to_script 的叶子文件夹并执行文件时,它运行正常。

另外,这个 cron 作业的日志文件将在哪里创建以便我可以查看它们?

【问题讨论】:

  • 我假设您正确设置了 cron 时间字段,并且您故意将它们遗漏了? IE。你知道你必须在你的 crontab 文件中写这样的“* */4 * * * 命令”——对吧?
  • 您的 crontab 中可能未配置 PATH 环境变量。将 perl 可执行文件的完整路径放入您的字符串中,看看是否有帮助
  • perl -q 应该做什么?我收到错误Unrecognized switch: -q
  • 在调试 cron 脚本时,不要将可能有用的输出发送到 /dev/null。

标签: perl crontab


【解决方案1】:

如果您在 perl 程序中使用命令,我建议您将命令的完整路径放入程序中。

我已尝试加载环境,但没有多大帮助。

在和一位同事的监督之后,我认为这是来自 perl 和系统环境之间的交互。

最好的问候, 穆斯塔法·库鲁马

【讨论】:

    【解决方案2】:

    通常 cron 会向您发送带有程序输出的邮件。当您弄清楚时,您可能想要检查环境。它不一定与您的登录 shell 环境相同(因为它不是登录 shell):

     foreach my $key ( keys %ENV ) {
         printf "$key: $$ENV{$key}\n";
         }
    

    如果你缺少你需要的东西,在你的 crontab 中设置它:

     SOME_VAR=some_value
     HOME=/Users/Buster
    

    如果你需要从一个特定的目录开始,你应该在那里chdir。 cron 作业的起始目录可能不是您认为的那样。如果没有参数,chdir 将更改为您的主目录。但是,有时这些环境变量可能不会在您的 cron 会话中设置,因此最好使用默认值:

     chdir( $ENV{HOME} || '/Users/Buster' );
    

    在不同的关键点,你应该给出错误输出。即使在非cron 程序中,这也是一件好事:

     open my $fh, '<', $some_file or die "Didn't find the file I was expecting: $!";
    

    如果您将内容重定向到 /dev/null,您将丢失所有可能帮助您解决问题的信息。

    【讨论】:

      【解决方案3】:

      看起来你可能错过了

      #!/usr/bin/perl
      

      在你的 perl 脚本的开头,这就是你可能需要 perl -q 来运行它的原因 添加该行后,您可以使用

      直接从命令行运行它
      /path_to_script/script.pl
      

      【讨论】:

      • 如果在命令行使用perl,则不需要shebang行。
      • true,或者如果你把 shebang 放在那里你就不需要 perl -q :) 然后你不必每次调用脚本时都继续写它。另外,脚本调用的最终目的地是 cron 而不是命令行,当然如果您愿意,您可以在其中再次编写 perl -q 。语义 r 我们。 :)
      • 你永远不需要 -q。这不是 perl 开关。
      • 你说得对 -q 不是 perl 开关,我愚蠢地复制了 OP 示例。
      【解决方案4】:

      您可能应该将工作目录更改为“叶文件夹”。

      在你的 crontab 命令中试试这个:

      cd /path_to_script; perl script.pl >/dev/null
      

      写。日志文件。 Cron 会将输出邮寄给您。但是由于您将 stdout 发送到 /dev/null,因此只会将 stderr 邮寄给您。

      如果您希望将输出保存在日志文件中,则将脚本的 stderr/stdout 输出通过管道传输到文件中,如下所示:

      cd /path_to_script; perl script.pl 2>&1 >my_log_file
      

      【讨论】:

      • Thanx :) 你能否帮我解决另一个问题——我想通过 perl 脚本发送电子邮件——不使用 CGI 模块或 Mod_Perl,而是通过一个简单的 perl 脚本。有没有办法做到这一点?
      • 我无法在评论中直接回答这个问题。我敢肯定,谷歌搜索会产生很多这样的例子。
      • Stackoverflow 上已有电子邮件问题的答案。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多