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

Jos*_*osh 16 process limit

我们有一个在我们的 Web 服务器上运行的脚本,由客户操作触发,它启动一个 unix 进程来生成一些缓存文件。由于此进程对我们客户提供的文件起作用,因此它有时会出现行为不端,运行时间过长以致生成它的 PHP 进程超时或使用太多 CPU 时间以致系统管理员将其杀死。

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

Mac*_*tka 13

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


Gil*_*il' 12

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

另请参阅是否有办法限制特定进程在 Unix 中可以使用的内存量? . 原理是一样的,你只是限制了不同的资源。

  • @Josh:如果您正在寻找类似于 `time php /cgi/foo.php` 的构造,您可以使用 `bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php`。 (6认同)