编写我的 linux 守护进程的首选方法是啥?

Posted

技术标签:

【中文标题】编写我的 linux 守护进程的首选方法是啥?【英文标题】:What is the preferred way to write my linux daemons?编写我的 linux 守护进程的首选方法是什么? 【发布时间】:2011-06-05 21:10:07 【问题描述】:

大家好 我有一个 php 网站,它应该使用一些缓存数据(例如存储在 Memcache 中)。 数据应由守护进程从 Web 服务获取数据存储在缓存中,其中一些数据也应存储在 mysql 服务器中。

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

    获取外汇汇率,对其进行解析并将其存储在数据库以及不同机器中的两个独立内存缓存中。 获取财务指标并将其存储在单独的内存缓存中。 获取大型 XML 数据并将其存储在两个单独的内存缓存中。

我能够用 C/C++/Perl/PHP/Python 编写这些守护进程。

我必须决定我应该选择哪种语言/脚本来实现这些守护进程。 使用 PHP 的好处是我可以使用网站应用程序本身使用的 API。另一个优点是 PHP 很简单,每个人都知道,所以我不会被束缚在维护这些守护进程上,但另一方面 PHP 速度较慢并且消耗更多资源。

使用 PHP 以外的其他语言的主要缺点是更难维护用 C/C++/Perl 编写的代码。如今,我想使用 C/C++/Perl 来完成这类任务并不常见。我说错了吗?

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

【问题讨论】:

你是说php代码比c或c++代码更容易维护? 那么,您的问题是什么?您是否在寻找阻止您使用 PHP 的人? 通常,因为它涉及中等应用程序,这是真的。我只代表我的经验;) 在您的系统上几乎(如果不是全部)您的守护进程是用 c/c++ 编写的 "使用 PHP 以外的其他语言的主要缺点是很难维护用 C/C++/Perl 编写的代码。现在,我想使用 C/C++ 完成这类任务并不常见/Perl。我说错了吗?”。是的,大错特错,但听起来你已经决定要用 PHP 编写代码,并且正在寻找对你决定的验证。 【参考方案1】:

最佳做法是使用您最熟悉的任何技术。你会:

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

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

【讨论】:

【参考方案2】:

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

但是,正如其他人所指出的,PHP 不适合长时间运行的守护程序,因为它以一种容易泄漏的方式处理内存。

因此,我将在定期(重新)启动的“cron”作业中运行这些任务,但请确保您运行的任务副本不会超出您的预期。

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

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

【讨论】:

【参考方案3】:

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

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

我很少有 perl 脚本做你正在做的事情。对我来说,棘手的部分是确保我的脚本不会长时间失败,因为我不想错过一大堆实时流数据。

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

【讨论】:

【参考方案4】:

短: 我会使用 Python。

更大: 我在 cli 模式下尝试过 PHP,我遇到了很多 内存泄漏,这肯定是因为 PHP 库不好,或者 PHP 库从来没有为别的事情做过在网络请求模式下快速死亡(例如,我对 PDO 持怀疑态度)。

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

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

然后对于应该完成的任务(获取数据、转换数据、存储数据等),这是 ETL 的工作。一个不错的开源工具是 Talend ETL (Java)。 Talend 有一些调度和监控工具,但没有开源(sort-of-open-source-where-you-must-pay-a-license)。但是为任务添加像 Nagios 这样的外部调度程序应该很容易(我希望如此)。您需要检查 memcached 是否可用作 talend ETL 的存储引擎或为您的插件编写代码。

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

【讨论】:

【参考方案5】:

为了简单/代码重用,最好的选择可能是 PHP。

PEAR System DaemonCreate daemons in php

编辑 据我所知,它只是传递数据,无需担心性能。关于资源使用,请确保不要用完 max_memory (通过流式传输或大量配置)。中止和记录耗时过长的操作。 SQL操作失败等时循环重连数据库

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

另外,请注意 Perl 在守护进程方面比 PHP 更精通。我省略了 c/c++,因为性能(传递数据)不是问题,而且守护进程编程已经够难了,为什么还要担心内存泄漏、段错误等?

【讨论】:

您可以安装仅命令行界面版本的 PHP 以最小化占用空间。您还可以设置 shell ini 脚本以确保守护程序在系统重新启动后加载。 clyfe:你说“中止和记录需要太长时间的操作”是什么意思?我不明白... 这个想法是跟上建议的 30 秒循环。当您读取服务时,有时可能需要很长时间才能响应(例如,它有太多同时请求)或根本停止响应,这些情况必须考虑在内,因为最轻微的错误可能会导致您的守护进程崩溃。 Monit 之类的内容也非常有用。 但是当你想编写守护进程时,我仍然对 PHP 不是自然选择的想法感到不安。出于某种原因,当谈到守护进程时,我不太有信心这样做......我知道这听起来不太专业或没有事实支持,但无论如何,你明白我在说什么吗? 就个人而言,我会选择 Ruby(web 和 daemon)。所以,在禅宗方面,我无法抚慰你的恐惧。确实 PHP 不是一个自然的选择,但尝试做一个心理映射,看看它是否满足您的需求(它可能满足)。如果有其他人在 PHP 中做守护进程,那就不用担心了吗?

以上是关于编写我的 linux 守护进程的首选方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

linux C守护进程编写

linux中进程 kacpid, kblockd是啥

Linux 守护进程

编写Linux/Unix守护进程

Qt中的linux系统守护进程

为啥在编写 linux 守护进程时必须与 tty 分离?