【发布时间】:2020-06-25 19:40:56
【问题描述】:
我有一个网站(Ubuntu OS 和 Apache 服务器上的 Wordpress 网站),其中包含特殊的数学计算器,其中许多使用 python3 脚本进行主要计算。这些计算器上的数据流是这样的:
1.) 用户在 html 表单中输入数字,然后点击提交按钮。
2.) 调用 PHP 函数,它将 html 用户输入分配给变量,并使用这些变量在适用的 python3 文件上执行 exec()(过滤用户输入并使用 escapeshellarg,所以在这里一切都很好)。
3.) PHP 函数返回 python3 脚本的结果,通过简码显示在计算器网页上。
我遇到的问题是,有时我的 python 脚本中的符号和数字计算会无限期地挂起。随着那个 python3 进程继续运行,它开始使用大量的 CPU 和内存资源(在流量高峰时段是个大问题)。
我的问题是:是否有某种方法可以在我的服务器后端创建一个脚本或程序,如果它超过了任意运行时和 CPU 使用级别,它将杀死 python3 的进程实例?我想把它限制在python3的实例上,这样它就不能杀死像mysqld这样的东西。另外,如果它只使用运行时作为终止条件,我也可以。在正常情况下,我的任何 python 脚本的运行时间都不应超过 ~10 秒,如果它们的运行时间不超过 10 秒,CPU 使用率不会成为问题。
【问题讨论】:
-
@stark 可能会回答我的问题。 bash 超时是可以在 PHP exec() 中调用的,还是我需要做更多的研究来制作一个单独运行的 Bash 文件?
-
关于 Bash 超时,我发现了这个线程:stackoverflow.com/questions/9419122/exec-with-timeout 使用该方法,我似乎可以通过执行类似的操作来实现它? $result = exec("timeout {$time} python_script.py "."variable1"."variable2");
-
Linux 有
setrlimit系统调用(并且shell 提供ulimit命令)...其中任何一个可能对您有用吗? -
@OndrejK。看起来可以以与 bash 超时类似的方式使用它。两者都超出了我目前的理解水平,但我认为 RLIMIT_CPU 可用于限制进程使用的 cpu 时间。我只是不确定它是否会直接应用于 python 进程。
标签: python php python-3.x linux ubuntu