编写linux守护进程的首选方法是什么?

时间:2011-01-08 20:43:45

标签: php c++ linux perl daemons

大家好。

我有一个PHP网站应该使用一些缓存数据(例如存储在Memcache中)。 数据应该通过守护进程从web服务中获取存储在缓存中,其中一些也应该存储在MySQL服务器中。

守护进程应该执行以下操作:

  1. 获取外汇汇率,解析它们并将它们存储在数据库中以及单独机器中的两个单独的内存中。
  2. 获取财务索引并将其存储在单独的内存中。
  3. 获取大型XML数据并将其存储在两个单独的内存中。
  4. 我能够用C / C ++ / Perl / PHP / Python编写这些守护进程。

    我必须决定使用哪种语言/脚本来实现这些守护进程。 使用PHP的优点是我可以使用网站应用程序本身使用的API。另一个优点是PHP很简单,每个人都知道它,所以我不会受到维护这些守护进程的限制,但另一方面,PHP速度较慢,消耗的资源也更多。

    使用除PHP之外的其他语言的主要缺点是维护用C / C ++ / Perl编写的代码更加困难。如今,我想使用C / C ++ / Perl执行这些任务并不常见。我这么说错了吗?

    在这种情况下,你建议我做什么?

5 个答案:

答案 0 :(得分:4)

对于简单性/代码重用,最好的选择可能是PHP。

PEAR System Daemon
Create daemons in php

EDIT
从我可以说它只是传递数据,它是没有性能担心。关于资源使用,请确保不要耗尽max_memory(通过流式传输或配置充足)。中止和记录操作需要太长时间。当SQL操作失败等时,在循环中重新连接到数据库。

注意事项 守护程序编程很棘手,很多事情都可能出错。考虑所有失败点。

另外,请注意Perl在守护进程方面比PHP更精通。我遗漏了c / c ++,因为性能(传递数据)不是问题而且守护程序编程很难,因为它为什么会增加对内存泄漏,段错误等的担忧?

答案 1 :(得分:4)

Perl和Python是编写此类脚本的默认答案。但是,如果您编写好的代码,那么(使用多少)您使用的语言并不重要。更重要的是你如何在失败时处理你的脚本。

从长远来看,你可能会看到你的脚本很少因任意原因而失败,而且调试脚本可能不值得,因为它通常做得很好,而且很难找到它出错的地方。 / p>

我很少有perl脚本做你正在做的同样的事情。对我来说,棘手的部分是确保我的脚本不会失败很长时间,因为我不想错过现场直播数据。

为此,我使用了monit。一个很棒的工具。

答案 2 :(得分:3)

最佳做法是使用您认识最好的技术。你会:

  • 更快地实施解决方案
  • 能够更好地调试您遇到的问题
  • 更容易评估可以为您卸载部分工作的库(甚至可以了解它们)
  • 可以更轻松地维护和扩展代码

实际上,除非您确实有真正的性能要求,否则速度和资源使用将相对不重要。

答案 3 :(得分:2)

短: 我会使用Python。

更大: 我在cli模式下尝试过 PHP ,我经历了很多内存泄漏,当然是因为PHP库很糟糕,或者PHP libs从来没有用过在Web请求模式下快速死亡(例如我在PDO上是可疑的)。

python 世界中,我最近看到了来自 shinken 的部分代码,它是一个很好的nagios重写为python守护进程,非常聪明。见http://www.shinken-monitoring.org/the-global-architecture/& http://www.shinken-monitoring.org/wiki/official/development-hackingcode。由于它是一个监控工具,你当然可以找到一些非常好的想法,让一些守护进程重复任务。

现在,我可以提出建议吗?为什么不使用Shinken或Centreon作为数据获取任务的调度程序? (也许很快就会有一个带有shinken引擎而不是nagios引擎的Centreon,我希望)?这对于检测外部数据的变化,提取中的问题等非常有用。

然后,对于应该完成的任务(获取数据,转换数据,存储数据等),这是 ETL 的工作。一个不错的开源工具是Talend ETL( Java )。有一些用于 Talend 的计划和监控工具,但不是开放源代码(开源类型,您必须支付许可证)。但是添加像Nagios这样的外部调度程序应该很容易(我希望)。您需要检查memcached是否可用作talend ETL的存储引擎或编写插件。

所以,这可以说比而不是语言你应该考虑工具。 或者不是,根据您可以假设的复杂性,每个工具都会增加自己的复杂性。但是如果你想从头开始重建python,那么快速有效。

答案 4 :(得分:0)

您应该使用与编写其他应用程序相同的语言。这样您就可以更轻松地重用代码和开发人员技能。

然而,正如其他人所指出的那样,PHP对于长时间运行的守护进程是不利的,因为它以一种容易泄漏的方式处理内存。

所以我会在一个定期(重新)启动的“cron”工作中运行这些任务,但要确保你没有运行比你想要的更多的任务副本。

Cron作业比守护进程更强大。

  • 失败并退出的cron作业将在下次安排时重新开始
  • 包含内存泄漏的cron作业将在结束运行时释放内存
  • 其软件升级的cron作业(库等)会在后续运行中自动获取新版本,而无需任何特别的努力。
  • “cron”已经提供了启动/关闭脚本,Ops团队可以使用它来控制它,因此您无需重写这些脚本。您的Ops团队已经知道如何操作“cron”,并知道如果要暂时禁用crontab条目,如何注释掉它们。