限制程序在Linux中运行的时间
在Linux中,我想运行一个程序,但只能在有限的时间内运行,例如1秒钟。 如果程序超过这个运行时间,我想杀死进程并显示错误消息。
StackOverflow不会允许我删除我的答案,因为这是可以接受的。 由于它位于榜单的顶端,并且在其下面有更好的解决scheme,所以它正在获得低票。 如果您使用的是GNU系统,请按照@wRAR的build议使用timeout
。 所以希望你停止投票,下面是它的工作原理:
timeout 1s ./myProgram
您可以使用s
, m
, h
或d
秒(默认如果省略),分钟,小时或天。 这里的一个很好的特性是你可以指定另一个选项-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/null
redirectkill的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 ...>
。