在达到时间限制后终止进程,或者让它运行直到完成,以较快者为准

在达到时间限制后终止进程,或者让它运行直到完成,以较快者为准

以下文章教我们如何运行一个进程一段时间: 让命令运行 5 分钟的简单方法是什么? 允许运行一段时间后终止进程

我特别喜欢这个答案:

YourCommand & read -t 300 ;  kill $!                           # 1st version

https://superuser.com/a/1045496

但是,如果我希望整个命令在完成过程所花的时间比最初指定的时间限制更短时完全终止,该怎么办?

我问这个问题是因为我实际上是在 PHP 脚本创建的子 shell 中运行这个命令:

// $wtime is some time limit
$cmd = "MyCommand & read -t {$wtime}; kill $!";
shell_exec($cmd);

如果“read -t...”没有完成,并且 MyCommand 的完成速度比它更快,那么我的 PHP 脚本将不会继续执行 shell_exec($cmd) 之后的下一行。

注意:我不需要使用 PHP 的答案,只需要 shell。这就是我在这里发布它而不是在 Stack Overflow 上发布它的原因。但是,我也欢迎任何使用 PHP 的答案。

答案1

有一个实用程序可以帮你解决这个问题 -timeout

例如:

timeout 5s sleep 30
  • -s INT- 默认情况下,发送 SIGTERM,但你可以更改它,例如:发送 SIGINT
  • -k ${DURATION}- 如果您的申请应该处理信号,但可能会卡住,您也可以在原始信号发送后的某个时间给出此参数来发送 SIGKILL。
  • --preserve-status- 如果应用程序应该处理信号然后返回有用的退出代码,那么您也可以给出这个参数,否则timeout如果超时将返回 124。

相关内容