【问题标题】:Tailing 'Jobs' with Perl under mod_perl在 mod_perl 下使用 Perl 跟踪“工作”
【发布时间】:2010-05-26 01:46:59
【问题描述】:

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

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

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

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

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

提前致谢。

【问题讨论】:

  • 看看这个 brian d foy 的回答是否有帮助:stackoverflow.com/questions/2711520/…
  • 是的,我看过那篇文章中的一些 CPAN 模块。它让我朝着一个好的方向前进。但是我需要一个模块来保持作业状态,以便每次调用 AJAX 脚本时,它都可以从文件/db/无论作业的状态是什么(通过 ID 或其他东西)加载。有谁知道这样做的 CPAN 模块?我会继续寻找...
  • 老实说,我会采用直截了当的方法...为原始作业创建一个唯一 ID(例如,$$ 和时间戳的组合),将其合并到文件名中,然后返回将原始请求中的 ID 存储在页面中......然后每个 AJAX 调用都会将该 ID 发送到服务器,读取日志的脚本会从中重建日志文件名
  • 是的,我做过类似的事情,我会发布我的解决方案。

标签: perl jobs mod-perl tail


【解决方案1】:

我在这个问题上的时间很短,并且在 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 脚本和作业守护进程通过身份验证的方式(数据库)进行通信。

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2011-01-12
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多