我可以将进程限制在一定的时间/CPU 周期内吗?

我可以将进程限制在一定的时间/CPU 周期内吗?

我们有一个在 Web 服务器上运行的脚本,由客户操作触发,该脚本启动一个 UNIX 进程来生成一些缓存文件。由于此进程作用于我们客户提供的文件,因此有时会出现行为异常,运行时间过长,导致生成它的 PHP 进程超时,或者使用过多的 CPU 时间,导致系统管理员将其终止。

是否有任何我可以运行的命令会限制进程的 CPU 时间/运行时间?我正在寻找类似的命令/usr/bin/time,我可以在其中运行该命令并将其传递给我希望它运行和限制的命令行。

答案1

除了吉尔斯的回答之外还有CPU限制工具可以完全满足您的需求 - 包括在运行时进行修改。此外,它还可以限制为仅某些 CPU/内核 IIRC。

答案2

从程序内调用setrlimit(RLIMIT_CPU, ...).从 shell 调用ulimit -t 42(这不是标准的,但大多数 UNIX 变体上的大多数 shell(包括 bash 和 ksh)都支持)。这会导致当前进程在用完 N 秒的 CPU 时间后被终止。该限制由子进程继承。一个常见的 shell 习惯用法是,(ulimit -t 42; runaway_process)如果您希望以后能够从同一个 shell 运行其他无限的进程。

也可以看看有没有办法限制 Unix 中特定进程可以使用的内存量? 。原理是一样的,只是限制了不同的资源。

答案3

您还可以使用该timeout命令阻止进程运行超过指定的时间。

例子

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

请参阅超时手册页了解更多详情。

相关内容