编写一个Linux服务

我想用PERL编写一个Linux服务,但不知道该怎么做。 (我知道perl

我有一个MySQL数据库,需要检查它的新logging,所以我可以处理它们。 该服务应该几乎立即响应,所以cron不是一个好的select,我不想使用一些解决方法,以便每秒运行我的脚本。 此外,脚本是线程的,可能需要一些时间,直到完成,所以克朗是不是我的好select。

所以,我有两种方法:

每秒查询数据库并在到达时处理新logging的服务。 或者像MySQL触发器那样在插入新logging时触发脚本。 但是,这不应该放慢插入logging的其他软件。

你build议我什么? 达到这个目标的最好方法是什么?

编辑:例如,编写服务时是否需要做这样的事情?

while(1){do stuff sleep(1)}并写一个简单的初始化脚本? 有没有更优雅的方式?

提前致谢,

有几个CPAN模块可以让你编写一个守护进程。 例如守护进程::守护进程 。
我不能100%确定这是否是一个好主意,取决于如何处理MySQL数据库,因为您需要仔细pipe理您的数据库连接,但是对于pipe理员来说,它变得更容易。 另外请记住,在数据库被另一个可能不适用于locking表的应用程序使用数据库时,要小心使用in和explicit锁。

FWIW,我喜欢“非分叉无限循环”解决scheme,与DJB的daemontools这样的进程pipe理器相结合。 我觉得Ubuntu的Upstart也提供了这个。 主要function是安装您的主pipe在失败时自动重启您的服务。

在守护进程的情况下,它也允许您将日志logging委托给另一个专用程序。 所有你需要做的服务是打印到标准输出。 为脚本设置日志logging服务时,可以使用multilog并保留一个专用日志,或者使用/ usr / bin / logger并输出到syslog,而不用修改脚本。 (Upstart可能会提供这个,但我不知道,我的主要经验是与守护神工具)

如果你讨厌DJB的发行版,可以考虑Runit ,它是DJB的守护神工具的一个分支,并提供许多相同的function。

如果您有多个logging插入,为每个插入触发一个外部服务将会终止您的应用程序。 然后您将要按照时间对其进行批量处理。 但是,对于less量的插入,您可能不希望等待批处理运行。 那么,触发器可能是好的。

为防止失败时崩溃,您可能需要将其configuration为重新生成 。 有很多方法可以做到这一点,包括像上面提到的那样使用daemontools ,把它作为inittab的一部分产生,甚至包装一个无限循环的shell脚本。

嵌套的无限循环!

如果可能的话,我也build议你用C来做。 如果需要速度,你不能打败它。 查看:

http://www.google.co.uk/search?rlz=1C1CHMA_en-GBGB359GB359&sourceid=chrome&ie=UTF-8&q=writing+a+linux+service+in+C

我build议Perl脚本监视MySQL二进制日志,并对任何大小的变化(这可能表示行被添加/删除/更新数据库中的任何地方)作出行动。

您可以使用Time :: HiRes模块一次睡眠四分之一秒,并检查日志文件大小的变化,然后运行相应的SQL。