我想使用 PERL 编写 Linux 服务,但不知道如何做。(我知道 perl)
我有一个 MySQL 数据库,需要检查其中是否有新记录,以便处理它们。该服务应几乎立即响应,因此 cron 对我来说不是一个好选择,而且我不想使用某些变通方法来每秒运行我的脚本。此外,该脚本是线程化的,可能需要一些时间才能完成,因此 cron 对我来说并不是一个好选择。
所以,我有两种方法:
每秒查询数据库并在新记录到达时进行处理的服务。或者像 MySQL 触发器一样,在插入新记录时触发脚本。但是,这不应该减慢插入记录的其他软件的速度。
你对我有什么建议?实现这一目标的最佳方法是什么?
编辑:例如,在编写服务时我是否需要做这样的事情?
while(1) { do stuff sleep(1) } 并编写一个简单的初始化脚本?有没有更优雅的方式?
提前致谢,
答案1
有几个 CPAN 模块允许你编写守护进程。例如守护进程::守护进程化。
我不能 100% 确定这是否是个好主意,这取决于 MySQL 数据库的处理方式,因为您需要小心管理数据库连接,但这对管理员来说会容易得多。另外请记住要小心内部和显式锁定,因为数据库由另一个应用程序使用,而该应用程序可能无法处理锁定的表。
答案2
无论如何,我喜欢“非分叉无限循环”解决方案与像 DJB 的 daemontools 这样的进程管理器相结合。我认为 ubuntu 的 Upstart 也提供了这个。关键功能是操纵您的管理器在服务失败时自动重新启动它。
对于 daemontools,它还允许您将日志记录委托给另一个专用程序。您的服务所需要做的就是打印到 stdout。当您为脚本设置日志记录服务时,您可以使用 multilog 并保留私人日志,或者使用 /usr/bin/logger 并输出到 syslog,所有这些都无需修改您的脚本。(Upstart 可能会提供此功能,但我不知道,我的主要经验是使用 daemontools)
如果你不喜欢 DJB 的发行版,可以考虑运行,它是 DJB daemontools 的一个分支,并提供许多相同的功能。
答案3
如果您插入了许多记录,则每次插入都触发外部服务会终止您的应用程序。然后,您将需要根据时间对其进行批处理。但是,对于插入数量较少的情况,您可能不想等待批处理运行。那么,触发器可能很好。
为了防止它在失败时崩溃,您可能需要将其配置为重生本身。有很多方法可以做到这一点,包括使用守护进程工具如上所述,将其作为 inittab 的一部分生成,甚至用执行无限循环的 shell 脚本包装。
嵌套无限循环!
答案4
我建议 Perl 脚本监视 MySQL 二进制日志并根据任何大小变化采取行动(这可能表示在数据库的任何位置添加/删除/更新行)。
您可以使用时间::高分辨率模块每次休眠四分之一秒,并检查日志文件大小的变化,然后运行适当的 SQL。