限制程序在Linux中运行的时间

在Linux中,我想运行一个程序,但只能在有限的时间内运行,例如1秒钟。 如果程序超过这个运行时间,我想杀死进程并显示错误消息。

StackOverflow不会允许我删除我的答案,因为这是可以接受的。 由于它位于榜单的顶端,并且在其下面有更好的解决scheme,所以它正在获得低票。 如果您使用的是GNU系统,请按照@wRAR的build议使用timeout 。 所以希望你停止投票,下面是它的工作原理:

 timeout 1s ./myProgram 

您可以使用smhd秒(默认如果省略),分钟,小时或天。 这里的一个很好的特性是你可以指定另一个选项-k 30s (在上面的1s之前),以便在另外30秒之后用SIGKILL杀死它,如果它不响应原始SIGTERM。

一个非常有用的工具。 现在向下滚动并向上投票@ wRAR的答案。


对于后人来说,这是我原来的劣等的build议,如果有人使用,也许还是会有的。

一个简单的bash脚本应该能够为你做到这一点

 ./myProgram & sleep 1 kill $! 2>/dev/null && echo "myProgram didn't finish" 

这应该做到这一点。

$! 扩展到最后的后台进程(通过使用& ),如果kill不杀死任何进程,则kill将返回false,所以只有在实际上杀死了某个回显时才会执行回显。

2>/dev/nullredirectkill的stderr,否则会打印一些信息,告诉你无法终止进程。

您可能需要添加一个-KILL或任何你想用来摆脱你的过程的信号。

编辑
正如Ephemient所指出的那样,如果你的程序结束了,而另外一些进程抢夺了pid,那么这里就会有一场比赛,那么就会被杀死。 为了减less它发生的可能性,你可以对SIGCHLD做出反应,如果发生这种情况,不要试图杀死它。 仍然有机会杀死错误的进程,但是非常遥远。

 trapped="" trap 'trapped=yes' SIGCHLD ./myProgram & sleep 1 [ -z "$trapped" ] && kill $! 2>/dev/null && echo '...' 

呃,好吧。 timeout(1)

描述
启动COMMAND,如果在DURATION之后仍然运行,就杀掉它。

也许CPU时间限制( ulimit -t / setrlimit(RLIMIT_CPU) )会有帮助吗?

你可以在shell脚本中使用&

 your_program & pid=$! sleep 1 if [ `pgrep $pid` ] then kill $pid echo "killed $pid because it took too long." fi 

希望你明白了,我不确定这是否正确我的shell技巧需要刷新一下:)

好吧,只要写一个简短的C程序,就可以调用fork ,调用execlp或类似的东西,测量父类中的时间并kill孩子。 应该很容易…

 tail -f file & pid=$! sleep 10 kill $pid 2>/dev/null && echo '...' 

如果你有源代码,你可以在main() fork()早期fork() ,然后让父进程测量时间并可能杀死subprocess。 只要使用标准的系统调用fork()waitpid()kill() ,…也许一些标准的Unix信号处理。 不要太复杂,但需要一些努力。

你也可以在shell上编写脚本,尽pipe我怀疑它在1秒的时间内是否准确。

如果您只是要测量时间,请在shell上键入time <cmd ...>