Tag Archives: perl

alarm 使用不当遇到的问题

前段时间发现有个程序总是运行一段时间就挂掉,看各种日志里面都没有错误信息,感觉就是莫名其妙突然进程就没了。 大概流程是有个 perl 程序 a.pl ….. my $pid = fork(); if ( !$pid ) { my $cmdRet = `b.pl 2>&1`; print FILE $cmdRet; if ( $status ) { warn "task failed"; } else { warn "task success"; } exit; }   waitpid …….. b.pl 里面会执行 rsync 去获取一些文件,他会循环到几个机器上面去 rsync for ( @hosts ) { my $result [...]

解析纯真 ip 库

纯真的 ip 库应用比较广泛,就那个 qqwry.dat。以前尝试过解析,死活弄不明白那写地址和 pack/unpack 啥的,晕的不行。这两天需要解析下,就尝试用 perl 写一个。 开始用 sysread/sysseek 很多都读不出来,看了n遍程序,没觉得有啥问题。后来全部改成了 read/seek 就好了,也不知道怎么回事。画了一个图说明下,参考了 http://lumaqq.linuxsir.org/article/qqwry_format_detail.html 。 发件人 2011-3-10 读来的3字节地址需要加 “\0″ 才能 unpack,不知道怎么回事,对这些问题弄不明白。对了,网上还有个 perl 版的,也能用,需要的话可以搜一下。

perl 里面的信号处理

perl 里面的信号处理很简单,就是给 %SIG 这个 hash 赋值就好了。前几天遇到个问题,处理 SIG{CHLD} 的时候,我本来只起一个 child 进程,可是发现这个信号会被触发多次,开始弄不明白,后来偶然想到是不是 system,exec 之类的函数弄出来的,搜了下果然。 perl 里面调用外部命令是会 fork 一个子进程的,所以也会触发那个信号,想避免可以设置局部变量,例如 $SIG{CHLD} = sub { print "main\n"; };   ….. { local $SIG{CHLD} = undef; # 注意调用外部命令的时候,如果 IGNORE 就捕捉不了结果了 `mv xxx yyy`; system(xxxxx); }   ….. 使用 {} 来构造局部变量的方法有时候会让问题变的非常简单。 另外,信号触发的时候,会把 sleep 中断,这个在 sleep 的 doc 里面说的很明白。如果还是想 sleep 到足够的时间,可以用下面的方法。 my $timeLeft [...]

无聊又写一个用来发邮件的 pm..

继使用 perl 发中文标题邮件,和中文附件邮件后,又把他们整合了一下写了一个 pm 干这个事。 其实发带附件的邮件应该是有现成的 pm 干这个事的,比如 MIME::Lite 之类,没特殊需求还是用那个吧,这个纯属无聊写的。 文件前面有使用方法。。 package SendMail;   use strict; use warnings; use Data::Dumper; use Encode; use MIME::Base64;   =head1 Examples use SendMail;   my $sm = SendMail->new( { To => ‘you@foo.com, other@bar.com’, Subject => ‘just a test 中文’, });   — or —   my $sm = SendMail->new( [...]

使用 perl 发带附件的邮件

继 上篇 使用 perl 发带中文标题的邮件后,又研究了下发带附件的。 基本差别不大,主要是那个 Content-type 要变一下。那个 boundary 可以自己随便写,和后面的统一就行了。 my $title = encode_base64("标题", ""); my $body = encode_base64("邮件正文"); my $attach = encode_base64("附件内容"); my $filename = encode(’MIME-B’, decode(’utf8′, "文件中文.txt"))   open(MAIL, ‘|/usr/sbin/sendmail -t’);   print MAIL "From: test\@abs.com\r\n"; print MAIL "To: test\@abs.com\r\n"; print MAIL "Subject: =?UTF-8?B?$title?=\r\n"; print MAIL "MIME-Version: 1.0\r\n"; # print MAIL "Content-type: text/plain; [...]

使用 perl 发送中文邮件标题乱码

代码如下面,解决乱码的方法是使用 base64 编码。 use MIME::Base64::Perl;   open(MAIL, ‘|/usr/sbin/sendmail -t’);   my $recver = ‘wangdong@abc.com’; my $alertTitle = "中文 asdfsdf sdfsdf sdf sdf s df sd fsd f sd fsd f sdf sdf sdf"; my $alertText = "body ";   my $encoded = encode_base64($alertTitle, "");   print MAIL "From: alert\@abc.com\r\n"; print MAIL "To: $recver\r\n"; print MAIL [...]

perl and fork

最近写程序用到了 fork ,记一下。 我在 perl 里面某个地方开始,fork 多个进程去操作 db,主进程等子进程完事后,再继续后面的操作。 use POSIX ":sys_wait_h"; my $thread_num = 5; my %pids = ();   # $dbi->{InactiveDestroy} = 1 用到 dbi 的话还要设置这个,要不子进程exit后,dbi # 连接就断了   # …..前面的程序 for ( 1..$thread_num ) { my $pid = fork; if (not $pid) { # 子进程 $pids{$pid} = 1; # blalbalbla… 子进程去干活 eixt 0; [...]

使用 perl 来登录网页

应该不能用。。。只是为了记录 使用 LWP::UserAgent 可以简单的去访问网页,获取页面内容。例如 use LWP::UserAgent;   my $ua = LWP::UserAgent->new(); $ua->timeout(10); $ua->agent(’mozilla’);   my $r = $ua->get(’http::/www.google.com’); print $r->content; # or $r->decoded->content $r 的其它属性可以去 cpan 看看。这样就获取到了内容。但是,如果一个网页是需要登录的怎么办?可以用保存 cookie 的方式。 use LWP::UserAgent; use HTTP::Cookies; use Digest::MD5 qw(md5 md5_hex); # 用来生成 md5 的 use JSON; # 用来在 json 串和 perl 的 hash 串之间转换 use Data::Dumper;   my [...]