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

时间:2010-03-05 14:41:18

标签: linux

在Linux中我想运行一个程序,但只能在有限的时间内运行,比如1秒钟。如果程序超过此运行时间,我想终止该过程并显示错误消息。

7 个答案:

答案 0 :(得分:101)

好吧,好吧。 timeout(1)

  

说明
        启动COMMAND,如果在DURATION之后仍然运行,则将其终止。

答案 1 :(得分:50)

StackOverflow不允许我删除我的答案,因为它是被接受的答案。它正在赢得低票,因为它位于列表的顶部,下方有更好的解决方案。如果您使用的是GNU系统,请使用timeout,而不是@wRAR建议的。因此,希望你能够停止投票,这是它的工作原理:

timeout 1s ./myProgram 

您可以使用smhd秒(默认情况下省略),分钟,小时或天。这里的一个漂亮的功能是你可以指定另一个选项-k 30s(在上面的1s之前),以便在另一个30秒后用SIGKILL杀死它,如果它没有响应原来的SIGTERM。

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


对于后人来说,这是我原来的 - 次要的 - 建议,如果有人使用它可能仍然存在。

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

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

应该这样做。

$!扩展到最后一个后台进程(通过使用&),如果kill没有杀死任何进程,则kill返回false,所以只有在实际杀死某些进程时才会执行echo

2>/dev/null重定向kill的stderr,否则会打印一些告诉你它无法杀死进程的东西。

您可能希望添加-KILL或您想要使用的任何信号来摆脱您的过程。

修改
正如ephemient指出的那样,如果你的程序完成并且其他一些进程抢占了pid,那么就会有一场比赛,它会被杀死。为了减少它发生的可能性,你可以对SIGCHLD做出反应,如果发生这种情况,不要试图杀死它。还有机会杀死错误的进程,但它非常遥远。

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

答案 2 :(得分:21)

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

答案 3 :(得分:3)

您可以使用&

在shell脚本中启动它
your_program &
pid=$!
sleep 1
if [ `pgrep $pid` ]
  then
    kill $pid
    echo "killed $pid because it took too long."
fi

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

答案 4 :(得分:1)

好的,所以只需编写一个简短的C程序fork,调用execlp或类似的东西,测量父项的时间和kill的孩子。应该很容易......

答案 5 :(得分:1)

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

答案 6 :(得分:0)

如果您有来源,可以在fork()的早期main()然后让父进程测量时间并可能终止子进程。只需使用标准系统调用fork()waitpid()kill(),......也许是一些标准的Unix信号处理。不太复杂但需要付出一些努力。

你也可以在shell上编写一些东西,尽管我怀疑它在1秒的时间内是否准确。

如果您只想测量时间,请在shell上输入time <cmd ...>