如何在一个进程结束时执行一个操作,同时有多个进程正在运行


How to perform an action when a process has finished, whilst there are multiple processes are running

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

我是否最好让php脚本将PID提供给python(我的主要语言)脚本的实例,该脚本不断检查进程是否已经完成,例如?我确实尝试把这个过程检查循环在PHP页面,但显然这使得PHP页面暂停,而它等待扫描完成,这并不适合我不幸的是,多个扫描将被运行。

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

有什么建议吗?甚至一些想法,我可以谷歌将非常感激!

谢谢

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

这个实现有多好取决于你的应用程序的规模。

我假定您是这样开始流程的:

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