我有一个Perl脚本,我想通过cron每4小时运行一次。但不知何故,如果我通过命令行运行它,它无法通过cron执行并运行正常。以下是我在crontab中设置的命令:
perl -q /path_to_script/script.pl > /dev/null
此外,当我在命令提示符下运行此命令时,它不会执行,但是当我进入path_to_script
中的叶子文件夹并执行该文件时,它运行正常。
此外,这个cron作业的日志文件将在何处创建,以便我可以查看它们?
答案 0 :(得分:8)
您应该将工作目录更改为“leaf folder”。
在crontab命令中尝试:
cd /path_to_script; perl script.pl >/dev/null
WRT。日志文件。 Cron会邮寄给你输出。但是,由于您已将stdout发送到/ dev / null,因此只会将stderr邮寄给您。
如果希望将输出保存在日志文件中,则将脚本的stderr / stdout输出传递到文件中,如下所示:
cd /path_to_script; perl script.pl 2>&1 >my_log_file
答案 1 :(得分: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 ,则会丢失可能有助于您解决问题的所有信息。
答案 2 :(得分:-1)
看起来你可能错过了
#!/usr/bin/perl
在perl脚本的开头,这就是为什么你可能需要perl -q来运行它 添加该行后,可以使用
直接从命令行运行该行/path_to_script/script.pl
答案 3 :(得分:-3)
如果您在perl程序中使用命令,我建议您在程序中放置命令的完整路径。
我尝试加载环境,但没有更多帮助。
在与一位同事监督之后,我认为这是来自perl与系统环境之间的互动。
祝你好运, Moustapha Kourouma