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


16

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

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

Answers:



12

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

另请参见是否有一种方法可以限制Unix中特定进程可以使用的内存量? 。原理是相同的,只是限制了其他资源。


问题是,我没有程序的源代码,所以我无法添加,setrlimit并且通过PHP生成它,所以我没有外壳……
Josh 2010年

6
@Josh:如果您正在寻找类似于的结构time php /cgi/foo.php,则可以使用bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php
吉尔斯(Gillles)“所以-别再邪恶了”

@乔什阿帕奇?我也认为可以将其设置为系统范围...
xenoterracide 2010年

@xenoterracide是的,它是Apache,但我只想限制这一进程,而不是所有的apache进程。吉勒斯的拳头oneliner可能效果很好!
乔什2010年

3

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

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

有关更多详细信息,请参见超时手册页

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.