这回答命令行命令自动杀死一个命令后,一定的时间
建议使用1行方法使bash命令行中运行的命令超时:
( /path/to/slow command with options ) & sleep 5 ; kill $!
但是,给定的“长时间运行”命令可能会在超时之前完成。
(让我们称它为“通常运行时间长但有时很快”的命令,或者简称为tlrbsf。)
所以这个漂亮的一行方法有几个问题。
首先,睡眠不是有条件的,因此在序列完成所花费的时间上设置了一个不希望的下界。当tlrbsf命令在2秒内完成时,考虑30秒或2m甚至5m的睡眠时间——这是非常不可取的。
其次,kill是无条件的,因此该序列将尝试kill一个未运行的进程并抱怨它。
所以…
是否有一种方法可以超时一个典型的长时间运行但有时快速(“tlrbsf”)命令
有一个bash实现(另一个问题已经有Perl和C的答案)
将终止在较早的两个:TLRBSF程序终止,或超时过去
不会杀死不存在/不运行的进程(或者,可选:不会抱怨失败的杀死)
不一定非要是一行字
可以在Cygwin或Linux下运行吗
... 还有,为了加分
在前台运行TLRBSF命令
任何“睡眠”或额外的进程在后台
这样,TLRBSF命令的stdin/stdout/stderr可以重定向,就像它已经直接运行吗?
如果是,请分享你的代码。如果不是,请解释原因。
我花了一段时间试图破解前面提到的例子,但我的bash技能达到了极限。
该解决方案不考虑bash监控模式。您可以使用适当的信号来终止your_command
#!/bin/sh
( your_command ) & pid=$!
( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$!
wait $pid 2>/dev/null && pkill -HUP -P $watcher
监控器在给定超时后终止your_command;脚本等待慢速任务并终止监视程序。注意,wait对不同shell的子进程不起作用。
例子:
Your_command运行超过2秒并被终止
your_command打断
( sleep 20 ) & pid=$!
( sleep 2 && kill -HUP $pid ) 2>/dev/null & watcher=$!
if wait $pid 2>/dev/null; then
echo "your_command finished"
pkill -HUP -P $watcher
wait $watcher
else
echo "your_command interrupted"
fi
Your_command在超时前完成(20秒)
your_command完成
( sleep 2 ) & pid=$!
( sleep 20 && kill -HUP $pid ) 2>/dev/null & watcher=$!
if wait $pid 2>/dev/null; then
echo "your_command finished"
pkill -HUP -P $watcher
wait $watcher
else
echo "your_command interrupted"
fi