在Linux中,我想运行一个程序,但只能运行有限的时间,例如1秒。如果程序超出此运行时间,我想终止进程并显示错误消息。
StackOverflow不允许我删除答案,因为它已被接受。由于它在列表顶部,下面有一个更好的解决方案,因此它获得了否决票。如果您使用的是GNU系统,请timeout按照@wRAR的建议使用代替。因此,希望您停止投票,这是它的工作方式:
timeout
timeout 1s ./myProgram
您可以使用s,m,h或d为秒(如果省略默认值),分钟,小时或天。这里的一个有趣的功能是,如果不响应原始SIGTERM,则可以指定另一个选项-k 30s(在1s上述选项之前),以便在30秒后用SIGKILL杀死它。
s
m
h
d
-k 30s
1s
一个非常有用的工具。现在向下滚动并向上投票@wRAR的答案。
为了后代,这是我最初的(次等的)建议,如果有人使用它可能仍然是。
一个简单的bash脚本应该可以为您做到这一点
./myProgram & sleep 1 kill $! 2>/dev/null && echo "myProgram didn't finish"
那应该做到的。
$!扩展到最后一个后台进程(通过使用&),并且kill如果没有杀死任何进程,则kill返回false,因此仅在实际上杀死了某些东西的情况下执行echo。
$!
&
2>/dev/null 重定向kill的stderr,否则它将打印出一些内容,告诉您它无法终止该进程。
2>/dev/null
您可能还想添加一个-KILL或任何您想用来摆脱进程的信号。
-KILL
编辑( Ephemenent指出),如果您的程序完成了,而其他进程抢走了pid,它就会被杀死,这是一场竞赛。为了降低发生这种情况的可能性,您可以对SIGCHLD做出反应,而不要尝试杀死它。仍然有机会消除错误的过程,但是它非常遥远。
trapped="" trap 'trapped=yes' SIGCHLD ./myProgram & sleep 1 [ -z "$trapped" ] && kill $! 2>/dev/null && echo '...'