【问题标题】:Perl processes disappears after some daysPerl 进程在几天后消失
【发布时间】:2014-03-04 08:30:11
【问题描述】:

我有一个 perl 文件 (test.pl)。

它将以重复的方式工作。 该文件的目的是从 DB 发送电子邮件

下面是test.pl中的代码

sub send_mail{

$db->connect();

# Some DB operations #
# Send mail #

$db->disconnect();
sleep(5);

send_mail();

}

send_mail();

我正在执行该文件的 5 个实例,如下所示

perl test.pl  >> /var/www/html/emailerrorlog/error1.log 2>&1 &
perl test.pl  >> /var/www/html/emailerrorlog/error2.log 2>&1 &
perl test.pl  >> /var/www/html/emailerrorlog/error3.log 2>&1 &
perl test.pl  >> /var/www/html/emailerrorlog/error4.log 2>&1 &
perl test.pl  >> /var/www/html/emailerrorlog/error5.log 2>&1 &

如果我执行命令ps -ef | grep perl | grep -v grep

我可以看到上述 perl 文件的 5 个实例

该文件将在几天内完美运行

但是过了几天,perl进程就会开始一个一个消失。

几天后,所有进程都会消失。 现在。如果我执行命令 ps -ef | grep perl | grep -v grep ,我看不到任何进程,

我在日志文件中看不到任何错误日志。

那么,perl 进程消失的可能性有多大?

如何调试?

在哪里可以看到 perl 错误日志?

在 Centos 和 Red Hat Linux 中也有同样的问题

有人知道吗?

【问题讨论】:

  • 你检查/var/log/messages了吗?
  • @sunil_milec 我没有通过终端获取特定文件夹。 cd /var/log/messages
  • /var/log 是一个文件夹,messages 是一个文件。
  • @sunil_mlec 好的。感谢您的回复。根据我的情况,我认为“Fabricio”的答案是正确的

标签: perl centos rhel


【解决方案1】:

我不能 100% 确定这是否是问题所在,但如果您避免在永久执行的进程中递归,它可能会有所帮助......这会慢慢增加堆栈的使用,并最终会在堆栈大小限制为时终止进程到达。

试试这样的:

sub send_mail{

   $db->connect();

   # Some DB operations #
   # Send mail #

   $db->disconnect();

}

while (1) {
   send_mail();
   sleep(5);
}

【讨论】:

  • 感谢您的回复。但是如果我们这样使用 while (1) { send_mail(); 有什么区别?睡眠(5); }
  • 我认为您应该在使用递归之前了解什么是递归以及它的含义。简而言之,如果你从a() 内部调用sub a(),这是递归,在你的情况下,因为你一直在调用它,堆栈内存使用量将增加,直到进程中断。有关此主题的更多信息here.
  • 不同之处在于,在您的实现中,您没有给代码一个退出递归的机会。因此,这样,您的代码会不断添加对系统堆栈的引用,几天后,堆栈变满,从而终止进程。
  • while (1) 将确保它永远运行。
  • @Linto 在我发送的上一个链接(递归)中,您有兴趣阅读Stack space部分
猜你喜欢
  • 2014-07-24
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
相关资源
最近更新 更多