1

我在 mod_perl 下运行了这个项目,显示了主机上的一些信息。此页面上有一个带有下拉菜单的文本框,允许用户 ping/nslookup/traceroute 主机。输出显示在文本框中,如tail -f.

它在 CGI 下工作得很好。当用户请求 ping 时,它会对服务器进行 AJAX 调用,实际上它会在服务器上启动 ping,并将输出发送到临时文件。然后后续的 ajax 调用将“跟踪”文件,以便更新输出,直到 ping 完成。作业完成后,临时文件将被删除。

但是,在 mod_perl 下,无论我做什么,我都可以阻止它创建僵尸进程。我已经尝试了一切,双叉,使用IPC::Run等。最后,在 mod_perl 下不鼓励系统调用。

所以我的问题是,也许有更好的方法来做到这一点?是否有 CPAN 模块可用于创建可在 mod_perl 下工作的命令行作业和拖尾输出?我只是在寻找一些建议。

我知道我可能会创建某种“工作”守护程序,我用详细信息发出信号并从中获取更新。它会运行命令并跟踪它们的状态等。但是有没有更简单的方法?

提前致谢。

4

1 回答 1

0

我在这方面的时间很短,并且对 CPAN 没有运气,所以我将在这里提供我的解决方案(我可能重新发明了轮子)。我必须马上完成一些事情。

我将在本例中使用 ping。

当用户请求 ping 时,AJAX 脚本会在数据库中创建一条记录,其中包含 ping 的详细信息(主机、间隔、计数等)。记录有一个自动递增的 ID 字段。然后它发送一个 SIGHUP 到一个作业守护进程,它只是一个守护进程的 perl 脚本。

该作业守护程序接收 SIGHUP,在数据库中查找新作业并处理每个作业。当它获得新作业时,它会分叉,将 PID 和“运行”状态写入数据库记录,根据唯一的作业 ID 打开 stdout/stderr 文件,并用于IPC::Run将 STDOUT/STDERR 定向到这些文件。

作业守护进程跟踪分叉的作业,如果它们运行时间过长则终止它们等。

为了跟踪输出,AJAX 脚本将作业 ID 发送回浏览器。然后在 Javascript 计时器上,调用 AJAX 脚本,该脚本基本上通过数据库记录检查作业的状态并跟踪文件。

当 ping 完成时,作业守护程序将记录状态设置为“完成”。AJAX 脚本会在它的常规状态检查中对此进行检查。

我这样做的原因之一是 AJAX 脚本和作业守护进程通过身份验证的方式(数据库)进行通信。

于 2010-05-27T01:30:51.077 回答