我在mod_perl下运行这个项目显示了主机上的一些信息。在此页面上是一个带有下拉列表的文本框,允许用户ping / nslookup / traceroute主机。输出显示在文本框中,如tail -f
。
它在CGI下运作良好。当用户请求ping时,它会向服务器发出一个AJAX调用,在那里它实际上启动ping,输出转到临时文件。然后随后的ajax调用将“尾随”文件,以便更新输出直到ping完成。作业完成后,临时文件将被删除。
然而,在mod_perl下,无论我做什么,我都可以阻止它创建僵尸进程。我已尝试过所有内容,双重分叉,使用IPC::Run
等。最后,mod_perl不鼓励系统调用。
所以我的问题是,也许有更好的方法来做到这一点?是否有可用于创建命令行作业的CPAN模块和可在mod_perl下工作的拖尾输出?我只是在寻找一些建议。
我知道我可能会创建某种“作业”守护进程,我会通过详细信息发出信号并从中获取更新。它会运行命令并跟踪它们的状态等。但是有更简单的方法吗?
提前致谢。
答案 0 :(得分:0)
我的这个时间很短,并没有CPAN的运气,所以我会在这里提供我的解决方案(我可能重新发明了轮子)。我必须马上完成一些事情。
我将在此示例中使用ping。
当用户请求ping时,AJAX脚本在数据库中创建一条记录,其中包含ping的详细信息(主机,间隔,计数等)。该记录具有自动递增ID字段。然后它将一个SIGHUP发送到一个作业守护进程,这只是一个守护进程的perl脚本。
此作业守护程序接收SIGHUP,在数据库中查找新作业并处理每个作业。当它获得一个新工作时,它会分叉,将PID和“运行”状态写入DB记录,根据唯一的作业ID打开stdout / stderr文件,并使用IPC::Run
将STDOUT / STDERR指向这些文件
作业守护程序会跟踪分叉的作业,如果它们运行的时间太长等就会将其删除。
为了延迟输出,AJAX脚本将作业ID发送回浏览器。然后在Javascript计时器上调用AJAX脚本,该脚本基本上通过数据库记录检查作业的状态并对文件进行尾部处理。
当ping完成时,作业守护程序将记录状态设置为“完成”。 AJAX脚本会对其进行常规状态检查。
我这样做的原因之一是AJAX脚本和作业守护进程通过并通过身份验证的方式(数据库)。