在Linux中我想运行一个程序,但只能在有限的时间内运行,比如1秒钟。如果程序超过此运行时间,我想终止该过程并显示错误消息。
答案 0 :(得分:101)
timeout(1)
。
说明
启动COMMAND,如果在DURATION之后仍然运行,则将其终止。
答案 1 :(得分:50)
StackOverflow不允许我删除我的答案,因为它是被接受的答案。它正在赢得低票,因为它位于列表的顶部,下方有更好的解决方案。如果您使用的是GNU系统,请使用timeout
,而不是@wRAR建议的。因此,希望你能够停止投票,这是它的工作原理:
timeout 1s ./myProgram
您可以使用s
,m
,h
或d
秒(默认情况下省略),分钟,小时或天。这里的一个漂亮的功能是你可以指定另一个选项-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)
您可以使用&
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 ...>
。