一段时间后中止程序

Posted

技术标签:

【中文标题】一段时间后中止程序【英文标题】:Abort a program after a certain time 【发布时间】:2010-09-02 16:54:09 【问题描述】:

我正在尝试为一个程序开发一个测试用例,如果它运行超过 4 秒,我希望测试用例失败。 这怎么能在Linux上完成? (我使用的是 Ubuntu)

我知道我可以为执行计时并使其失败时间 > 4,但这只是一种糟糕的方法。

谢谢!

【问题讨论】:

嗯,我不喜欢这两个答案,难道没有办法通过超时来解决吗? 你必须在某个地方设置一个限制。更糟糕的解决方案是不断地进行无限循环检查;这会增加 CPU 使用率,并可能影响测试用例的持续时间。再次更新我的答案,您现在可以选择一个间隔(目前设置为 0.5 秒),如果您的测试用例立即完成,则没有延迟。 【参考方案1】:

(shell脚本解决方案) 在后台运行您的测试用例,获取它的 PId,并在 4 秒后检查该进程是否仍在运行。

wait_seconds=4
interval_seconds=0.5
run_your_test_case &
pid=$!
max=`expr "$wait_seconds / $interval_seconds"`
for (( I=0; I<$max; I++ ));do
    if kill -0 $pid >/dev/null;then
       echo 'test failed'
    else
       echo 'test ok'
       break
    fi
    sleep $interval_seconds
done

【讨论】:

效果很好!将 >/dev/null 更改为 2>/dev/null 但是,现在测试需要 最少 4 秒 已更新,现在需要 1、2、3 或 4 秒。【参考方案2】:

最终解决方案:

  1 ./slowprogram.sh >/dev/null &
  2 pid=$!
  3 exitbreak=0
  4 for c in 0..4; do
  5         sleep 1
  6         kill -0 $pid 2>/dev/null
  7         if [ $? -ne 0 ] ;then
  8             exitbreak=1
  9             break
 10         fi
 11 done
 12 if  [ $exitbreak == 1 ]; then
 13         echo '[ OK ]'
 14 else
 15         echo '[FAIL]'
 16         kill -9 $pid 2>/dev/null 
 17 fi

【讨论】:

【参考方案3】:

你也可以做类似&lt;command&gt; &amp; sleep 5 &amp;&amp; kill $!

【讨论】:

以上是关于一段时间后中止程序的主要内容,如果未能解决你的问题,请参考以下文章

线程被中止错误

.NET 中的线程中止

Azure Web 应用程序:Web 套接字在 100 秒后中止

中止陷阱:C 程序中的 6 个

调试中自发的应用程序执行中止

Linux终端关闭后台进程也结束原因分析和nohup的使用