【问题标题】:How to perform an action when a process has finished, whilst there are multiple processes are running如何在进程完成时执行操作,同时有多个进程正在运行
【发布时间】:2023-04-04 09:40:01
【问题描述】:

我正在为我的公司制作一个扫描服务器,它将用于从 nessus、nmap、nikto 等工具启动扫描。我已经用 php 编写了页面,所以一旦启动扫描,它就会成为背景处理并返回PID。设计规范的一部分是,一旦扫描完成,结果就会通过电子邮件发送给适当的顾问。这是我正在寻找一些想法的地方,因为我不确定如何去做。

我是否最好让 php 脚本将 PID 提供给 python(我的主要语言)脚本的实例,例如,该脚本会不断检查进程是否已完成?我确实尝试将此过程检查循环放在 PHP 页面中,但显然这会使 PHP 页面在等待扫描完成时暂停,不幸的是,这对我不起作用,因为将运行多个扫描。

或者我会更好地创建一个数据库来存储有关进程的状态信息?我没有数据库经验,但这可能是学习的好时机。

有什么建议吗?即使是我可以用谷歌搜索的一些想法也将不胜感激!

谢谢

【问题讨论】:

    标签: php python process


    【解决方案1】:

    当我遇到这类问题时,我通常会做一个 Python 守护进程来完成整个工作,让 PHP 只是向这个 Python 守护进程发送消息。这些消息可以是非常简单的东西,例如目录中不断检查的一堆文件,或者在数据库中注册。

    这种实现的好坏取决于您的应用程序的规模。

    【讨论】:

    • 我什至没有考虑过 python 守护进程。有趣的!我去看看,谢谢。
    【解决方案2】:

    我假设您正在启动这样的流程:

    exec("/path/to/file > /dev/null 2>&1 &");
    

    ...在这种情况下,您可以将另一个脚本放在中间:

    exec("/path/to/file | php /some/php/script.php > /dev/null 2>&1 &");
    

    然后,在script.php 中(如果你愿意,也可以在 python 中进行),你可以这样做:

    while (!feof(STDIN)) {
      sleep(1); // ...or something less horrible that also avoids racing
    }
    
    // When you get here, the process has finished
    

    【讨论】:

    • 唯一的问题是它会创建 更多 进程...如果您同时执行大量进程,可能会占用服务器资源。
    • 感谢您的帮助 - 这是我用来启动进程的代码。这似乎是个好主意,但正如您所说,创建更多流程可能是一个问题。我想我还需要实现一些代码来检查以确保不超过 x 数量的进程正在运行源自扫描页面。是否可以将其合并到 PHP 代码中?
    • 这可能是可能的,但很难。这些流程通常运行多长时间?如果您想这样做,似乎使用守护程序可能会更好 - PHP 页面将与守护程序通信,是时候启动进程了,而守护程序将跟踪进程并处理电子邮件发送(很像 @ lfagundes 建议)
    • 嗯,如果 IP 范围很大,某些进程可能会运行 20 分钟以上。在这种情况下,我将研究编写一个守护进程。非常感谢大家的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多