【问题标题】:Writing a daemon in perl用perl写一个守护进程
【发布时间】:2011-06-25 17:12:55
【问题描述】:

我正在用 Perl 为时事通讯编写一个守护进程。

守护程序将在服务器上 24/7 全天候运行。它几乎一直都与 postgresql 数据库建立有效连接。

我对 Perl 没有太多经验,所以如果你们中的一些人可以分享以下信息,我会很高兴:

  1. 如何限制 RAM。我不想离开公羊。正如我所说,这个程序将一直作为守护进程运行而不会停止。

  2. 编写此类守护程序时应该注意什么?

【问题讨论】:

  • 这里有一个 perl 守护进程教程,但没有指定它是用于哪个 Perl,所以可能有点过时:webreference.com/perl/tutorial/9
  • 我见过,但我更喜欢使用 Proc::Daemon。有什么大的区别吗? :)

标签: perl postgresql daemon


【解决方案1】:
  1. 就 SQL 连接而言 - 确保不会泄漏内存。从查询中检索您需要的最少数据量,并确保存储数据的数据结构立即超出范围,以便垃圾收集器可以回收它们

    请注意,您可能无法控制内存泄漏(例如在 Postgresql 连接代码中)。这是众所周知的。该问题的最佳解决方案(没有进行精确的内存分析和修复底层库中的泄漏)是让您的守护进程拉出 Phoenix - 停止做它正在做的事情并 exec() 自己的新副本。

  2. 就编写 Perl 守护进程而言,一些资源:

【讨论】:

  • 我正在使用这个 Proc::Daemon->new() 作为守护进程。如果我使 pgsql 连接不持久并且取消定义保持连接的变量,那会不会有问题?
  • 这完全取决于可能存在哪种内存泄漏(存在一种)。有些可以通过这种方式修复。有些不能并且需要“全流程重启” - 例如如果泄漏在 XS C 代码中。
  • 所以在这种情况下,我需要杀死 perl 脚本的 unix 进程并重新启动它,对吗?
  • 不 - 你可以exec() 进程(这会用新进程替换现有进程)或fork 并杀死父进程。
  • 非常感谢您的帮助! :)
【解决方案2】:

需要注意的一件事是内存泄漏。 SO上有一个非常nice thread about memory leaks in Perl。

【讨论】:

    【解决方案3】:

    关于#1:Perl 是垃圾回收的。

    这样做的有效含义是,您应该确保在完成所有对数据的引用后清理它们,从而允许垃圾收集器运行。

    http://perldoc.perl.org/perlobj.html#Two-Phased-Garbage-Collection

    【讨论】:

    • 是的,我“取消定义”除了需要一直处于活动状态的数据库连接之外的所有变量...
    • 这是可能的问题 - 您可能可能在 DB 连接对象(包括 XS 代码)中存在内存泄漏。不太可能,但并非不可想象。
    • 好的,如果我让它不持久并且每次我停止使用它时取消定义它会解决可能的问题吗?
    • 如果将对象放入哈希表中并且没有在其他任何地方引用,则可能会泄漏。
    • @maxelost:你为什么这么说? Perl 的 GC 仅基于引用。如果它们没有在其他任何地方引用,它们就不会泄漏。
    猜你喜欢
    • 2011-02-27
    • 2012-10-25
    • 2023-03-26
    • 2011-09-20
    • 2015-07-05
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多