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

Ove*_*ath 39 linux

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

wRA*_*RAR 102

呃,好吧.timeout(1).

描述
启动命令,如果在DURATION之后仍然运行,则将其终止.

  • 我觉得这里有一些误解.一个简单的"男人超时"可以表明这个答案是对手头问题最准确的答案(虽然有些简洁). (5认同)
  • timeout(1)在GNU coreutils中. (4认同)
  • 请评论downvoting. (2认同)

fal*_*tro 52

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

timeout 1s ./myProgram 
Run Code Online (Sandbox Code Playgroud)

您可以使用s,m,hd为秒(如果省略默认值),分钟,小时或天.这里的一个漂亮的功能是你可以指定另一个选项-k 30s(在1s上面之前),以便在另外30秒后用SIGKILL杀死它,如果它不响应原始的SIGTERM.

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


对于后代来说,这是我原来的 - 低级的 - 建议,如果有人使用它可能仍然存在.

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

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"
Run Code Online (Sandbox Code Playgroud)

应该这样做.

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

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

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

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

trapped=""
trap 'trapped=yes' SIGCHLD
./myProgram &
sleep 1
[ -z "$trapped" ] && kill $! 2>/dev/null && echo '...'
Run Code Online (Sandbox Code Playgroud)

  • Downvote是因为来自@wRAR的答案看起来更简洁,更有说服力.更清洁. (4认同)

wRA*_*RAR 21

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