我试图写入文件 ~/.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();
4条答案
按热度按时间mlnl4t2r1#
您需要调试脚本的每一步。您有:
虽然您可能更改了问题的URL,但是
get
可能返回undef。我不确定您为什么在那里使用until
。您想一直运行它直到网站上线吗?检查所有内容的返回值,看看发生了什么。我会把你剧本的大部分内容简化为:
但是,不用休眠30分钟,只需每30分钟从cron运行一次脚本,这样就可以消除循环:
uujelgoq2#
也许你不够耐心?我看到脚本在退出前等待了3分钟。
请注意,
$|
只对 * 当前选择的文件句柄 * 有效,这里的意思是STDOUT
。你可以用传统的复杂方法为任何文件句柄设置它:
或者,如果您的文件句柄是某个特定类的后代--并且自动激活的句柄可能属于这个类--那么您可以改用
autoflush
方法,这对您来说要容易得多,但是在底层执行相同的操作:希望后者能奏效。
请参阅IO::Handle和FileHandle以了解
autoflush
--它们是相关的,但我不确定哪个适用于这里。tp5buhyn3#
您提供的代码只在出现错误或$match_string位于$content中时才写入日志文件。是否一切正常,但没有匹配,因此空日志文件正是您所期望的?
vm0i2vca4#
先把事情简单化
这个管用吗?