我正在尝试写入文件〜/ .log ,但文件仍为空。 我不知道为什么会这样,一切似乎都很好。
我的系统是Ubuntu 9.10amd64,Perl 5.10。
#!/usr/bin/perl
# vim:set filetype=perl:
use strict;
use warnings;
use LWP::Simple qw||;
use Net::SMTP;
# Only because log file
$| = 1;
my $match_string = "... some text to match ..." ;
my $content;
my @mails = ('mejl1@provider1.com',
'mejl2@provider2.com',
);
my $data = <<END;
... Subject text ...
END
open(my $log, ">>","$ENV{HOME}/.log")
or die "Couldn't open log file";
sub get( $ ) {
my $content_ref = shift;
print {$log} "get: Error: $!\n"
until ( ${$content_ref}
= LWP::Simple::get("www.somesite.com/index.html") );
}
my $check_num = 0;
get( \$content );
while ( index($content, $match_string) != -1) {
print {$log} "Check number $check_num\n"
or die "Couldn't write in log file";
# This is printed
# print "Check number $check_num: $ENV{HOME}/.log\n";
$check_num++;
get( \$content );
sleep 60*30;
}
my $server = "smtp.my_provider.org";
my $smtp = Net::SMTP->new($server)
or print {$log} "smtp: Couldn't connect on $server\n";
$smtp->mail('my_mail@my_provider.org')
or print {$log} "smtp: Error in mail\n";
$smtp->bcc(@mails)
or print {$log} "smtp: Error in bcc\n";
$smtp->data();
$smtp->datasend($data)
or print {$log} "smtp: Error when sending data\n";
$smtp->dataend;
$smtp->quit();
答案 0 :(得分:7)
您需要调试脚本的每个步骤。你有:
print {$log} "get: Error: $!\n"
until ( ${$content_ref}
= LWP::Simple::get("www.somesite.com/index.html") );
虽然您可能更改了问题的网址,但是编写的get
可能会返回undef。我不确定你为什么在那里使用until
。你想在网站上线之前永远运行吗?检查所有内容的返回值,看看发生了什么。
我将脚本的大部分内容简化为:
while( 1 ) {
my $data = LWP::Simple::get("http://www.somesite.com/index.html");
print "got [$data]\n";
if( substr( ... ) > -1 ) { sleep 1800; next }
.... do error stuff here ...
}
但是,不要睡30分钟,而是每隔30分钟从cron运行一次脚本。这样你摆脱了循环:
my $data = LWP::Simple::get("http://www.somesite.com/index.html");
print "got [$data]\n";
exit if( substr( ... ) > -1 );
.... do error stuff here ...
答案 1 :(得分:6)
也许你不够耐心?我看到脚本在退出前等了3分钟。
请注意,$|
仅适用于当前选定的文件句柄,这意味着STDOUT
。
您可以为旧学校的任何文件句柄设置它,复杂的方式:
{
my $old = select $log;
$| = 1;
select $old;
}
或者,如果你的文件句柄是从一个特定的类下降 - 并且它可能是自动生成的句柄属于这个类 - 那么你可以使用autoflush
方法,这对你来说要容易得多,但是同样的事情在引擎盖下:
$log->autoflush(1); # untested
让我们希望后者有效。
请参阅IO::Handle和FileHandle了解autoflush
- 它们是相关的,但我不确定哪个适用于此处。
答案 2 :(得分:2)
如果出现任何问题,或者$ match_string位于$ content中,您提供的代码只会写入日志文件。可能是一切都运行良好但没有匹配,所以空日志文件正是你应该期待的吗?
答案 3 :(得分:1)
首先尝试简化
open(my $log, ">>","~/.log")
or die "Couldn't open log file";
print $log "smtp: Error in mail\n";
close $log
这有效吗?