这个答案针对命令行命令在一定时间后自动终止执行提出了一种一行代码的方法,用于从bash命令行超时终止长时间运行的命令:
( /path/to/slow command with options ) & sleep 5 ; kill $!
但是一个长时间运行的命令可能会在超时之前完成。
(我们称其为“通常长时间运行但有时很快”的命令,或者为了好玩而称之为tlrbsf。)
因此,这种巧妙的一行代码方法存在几个问题。
首先,sleep
不是条件性的,因此它设置了序列完成所需的不良下限时间。当tlrbsf命令在2秒内完成时,请考虑30秒、2分钟甚至5分钟的睡眠时间- 这是非常不理想的。
其次,kill
是无条件的,因此该序列将尝试杀死一个非运行进程并抱怨。
所以...
是否有一种方法可以超时一个通常长时间运行但有时很快("tlrbsf")的命令,使其
- 具有bash实现(其他问题已经有Perl和C的答案)
- 将在以下两者中较早终止:tlrbsf程序终止,或超时时间到期
- 不会杀死不存在/未运行的进程(或者,可选:不会抱怨错误的杀死)
- 不必是1行代码
- 可以在Cygwin或Linux下运行
...并且,额外加分项:
- 在前台中运行tlrbsf命令
- 任何“睡眠”或额外进程在后台运行
这样,tlrbsf 命令的标准输入/输出/错误可以被重定向,就像直接运行一样吗?
如果是这样,请分享你的代码。如果不是,请解释原因。
我已经花了一段时间尝试破解上述示例,但我达到了我的 Bash 技能极限。
timeout
实用程序的原因? - Chris Johnsontimeout
真是太棒了!你甚至可以将其用于 多个命令(多行脚本):https://dev59.com/EloT5IYBdhLWcg3w8jJm#61888916 - Noam Manos