免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2775 | 回复: 10
打印 上一主题 下一主题

perl程序的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-04 17:33 |只看该作者 |倒序浏览
我有一个perl程序,使用crontab调度执行,每分钟调度一次。

一天执行:24 * 60 = 1440 次

绝大部分次数都没有问题,但有时候出现阻塞的情况,永远不会自动退出,必须用kill -9才能杀死,看不出有什么规律,我怎么也想不出阻塞的原因,直接手动执行又没有什么问题。

我真希望有一个类似gdb的程序,可以attach到某个进程调试,好象perl没有这种功能。

大家说说,有什么办法确定问题所在?

论坛徽章:
0
2 [报告]
发表于 2010-02-04 17:39 |只看该作者
man perldebug

这种无法确定是否及时退出的脚本,最好设置一个文件mark.
如果程序在运行,则mark存在,程序退出后,删掉mark。
这样下一个instance启动时,就可判断前一个instance是否还alive.

论坛徽章:
0
3 [报告]
发表于 2010-02-04 17:49 |只看该作者
啥意思? 我咋没看明白 仙子 说的啥呢

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-02-04 17:51 |只看该作者
strace -p <pid>

论坛徽章:
0
5 [报告]
发表于 2010-02-06 14:04 |只看该作者
谢谢flw斑竹。
dragon23452345 该用户已被删除
6 [报告]
发表于 2010-02-06 17:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2010-02-10 08:53 |只看该作者
现在问题终于出现了,根据flw斑竹的建议,我使用truss,freebsd下的类似strace工具,检查挂起的程序,发现如下问题:

sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)
sigreturn(0xbfbfe8b0)                            = 1163155794 (0x45545952)

sigreturn是freebsd的函数。
以上信息不断出现,看样子是产生了异常,返回以后继续产生异常。所以反复执行同一段代码,进入了一个死循环,但不知道perl为什么会出现这种情况。大家有什么意见和建议?

论坛徽章:
0
8 [报告]
发表于 2010-02-10 09:38 |只看该作者
用Devel::NYTProf  分析程序

死循环是人的逻辑问题跟 perl有啥关系

说句玩笑话:拉不出屎来总不能怪地球没引力吧

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2010-02-10 09:59 |只看该作者
我这里是好的

论坛徽章:
0
10 [报告]
发表于 2010-02-21 22:10 |只看该作者
我一直在想办法解决这个问题。

我有两个一模一样的系统(我说一模一样,是说软件环境一模一样,我把FreeBSD和Perl精减后,压缩成一个20MB的文件,复制到两台裸机上)。

其中一台机器从来没有出现过这个问题。另外一台机器有两个程序出现了这个问题。用truss后,都是显示由于反复调用sigreturn,无法退出。

其中一个程序,我把use sigtrap 这行注释掉以后,有很多天没有出现了这个问题了。
另外一个程序,即使注释掉use sigtrap,仍然出现问题。

检查sigreturn函数手册,这是一个信号处理的函数,应用程序根本不应该调用。

一般perl写的程序都非常高级了,在什么情况下会反复进入信号处理函数呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP