我在屏幕上运行perl脚本(我可以login并检查debugging输出)。 脚本的逻辑中没有任何东西应该能够杀死它。
我只是两个有权访问服务器的人之一,另一个人发誓,这不是他(我们都有相当多的钱骑在它继续顺利运行)。 我没有理由相信一些黑客已经设法得到一个壳或类似的东西。 我几乎没有理由怀疑主机操作的pipe理员(带宽/ CPU明智,这个脚本是相当轻量级的)。
屏幕继续运行,但在perl脚本的输出结尾,我看到“Killed”,并且已经回到提示。 我该如何去testing什么是重击该死的东西?
我已经检查过crontab,那里没有任何东西会杀死随机/非随机进程。 任何日志文件中都没有提供任何提示。 它将运行2到8小时,似乎(并在我家里的Mac,它将运行24小时以上没有问题)。 服务器运行的是Ubuntu版本的东西或其他东西,我可以看看,如果它很重要。
没有太多的实际知识,如果OOM杀手正在运行,我会开始查看dmesg输出或各种系统日志。 如果是这样的话,可能就是这样。
为所有信号(TERM,SEGV,INT,HUP等)input信号处理程序,并在被命中时让它们注销。 它不会告诉你什么是发送信号,但它会让你看到它是什么信号,也许忽略它。
$SIG{'TERM'} = $SIG{'INT'} = sub { print(STDERR "Caught SIG$_[0]. Ignoring\n"); };
当它抓到一个sigterm或sigint时会打印出来,然后将控制返回到程序。 当然,所有这些信号都被忽略了,杀死它的唯一方法就是让程序本身退出,或者发送一个不能被捕获的SIGKILL。
我意识到这不完全是你问的问题的答案,所以我道歉,如果它有点偏离主题,但:你的应用程序真的需要永远运行,永远? Perl并不是世界上资源节约最多的环境,虽然解释器启动的开销并不是没有缺点,但极长时间运行的脚本可能会有自己的麻烦 – 内存泄漏,通常在您的控制之下是开发人员存在的祸根,这就是为什么人们经常通过像Perl :: POE这样更正式的资源保护主义的子环境中运行,或者通过交付长时间运行的聆听者部分来缓解这些问题的原因。这个工作就像xinetd这样的前端服务,只有在需要完成工作时才执行perl组件。
我运行了几个perl脚本,它们连续读取和处理我们(相当大的)中央系统日志stream的输出; 他们遭受了可怕的,莫名其妙的“尽pipe修剪散列键没有释放内存”的问题,并且在一个更适合于连续的高容量input(像Gearman这样的事件队列,例如),所以我们可以让perl去做最好的数据消除任务。
那有点过了 我很抱歉。 我希望这至less有点帮助!
系统日志是第一个要咨询。 如果还不够…
你不能确定谁发送信号给一个进程。 这可能是另一个过程,也可能是内核等。涉及到最近的perf框架的一些猜测涉及的简短。
但是,您可以设置一些更好的监控。 debian / ubuntu中的atop软件包build立了一个logging系统负载和每个进程活动(磁盘,内存,CPU)的服务。 然后,您可以查看这些日志,并了解进程崩溃时发生了什么。
碰撞过程: sudo atop -r ,使用t和T导航,键入h以获得关于各种可视化的帮助。
也可以考虑添加一个将pstree转储到临时文件的信号处理程序。
可能你遇到了资源限制。 例如CPU时间。 尝试ulimit -a来检查。 如果它只是一个软限制,在login脚本中设置,那么你可以修复它,例如, ulimit -t unlimited 。 如果这是一个严格的限制,例如在OpenBSD和其他操作系统上为常规用户设置,那么你将不得不重写。
直到你指出问题,运行脚本
nohup scriptname
可以帮助。 如果它仍然崩溃,请检查nohup.out文件。
如果这里没有提到任何帮助,我会尝试使用strace / ltrace来查看脚本在失败之前正在做什么系统或库调用,但是它们会生成很多输出。
在以前的生活中,我发现了一个DEC Ultrix盒子,它有一个非常聪明的cron作业,它查找所有超过1个CPU小时的进程并杀死它们。 这就是为什么晚间批量报告工作每晚都会死亡的原因。
任何聪明的cron作业/脚本可能会杀死它? 或者它可能是另一个性能调整参数,或者像已经给出的ulimit答案一样。