Answers:
保存为 tkill
(使其可执行并调整您的 PATH
如果需要的话):
#!/bin/bash
_terminate_children() {
trap "exit 143" SIGTERM && kill -- -$$
}
trap _terminate_children SIGINT SIGTERM
tout="$1"
shift
eval $@ | tee >(while :; do
read -t "$tout"
case $? in
0) : ;;
1) break ;;
*) _terminate_children ;;
esac
done)
exit ${PIPESTATUS[0]}
tkill 30 some_command
第一个论点( 30
这里是以秒为单位的超时。
tkill
预计 some_command
生成文本(非二进制)输出。 tkill
探头 stdout
给定命令。包括 stderr
像下面的最后一个高级示例中那样重定向它。 这些是有效的例子:
tkill 9 foo -option value
tkill 9 "foo -option value" # equivalent to the above
tkill 5 "foo | bar"
tkill 5 'foo | bar'
tkill 5 'foo | bar | baz' # tkill monitors baz
tkill 5 'foo | bar' | baz # baz reads from tkill
tkill 3 "foo; bar"
tkill 6 "foo && bar || baz"
tkill 7 "some_command 2>&1"
在这些引号中使用Bash语法。
some_command
退出然后退出状态将被重新用作退出状态 tkill
; tkill 5 true
回报 0
; tkill 5 false
回报 1
; tkill 5 "true; false"
回报 1
。 tkill
被打断了 SIGINT
要么 SIGTERM
然后退出状态将是 143
。 所以,基本上是这样的:
#!/bin/bash
tmp1=/tmp/tmp-$$-1
tmp2=/tmp/tmp-$$-2
touch $tmp1
touch $tmp2
time_out=30
typeset -i i
i=0
my-program > $tmp1 &
pgmpid=$!
while ps $pgmpid > /dev/null ; do
sleep 1
if diff $tmp1 $tmp2 > /dev/null ; then
i=i+1
if [ $i -gt $time_out ] ; then
kill $pgmpid
fi
else
i=0
cp $tmp1 $tmp2
fi
done
rm -f $tmp1 $tmp2
在将输出复制到文件的同时在后台运行该程序。 30秒后,如果文件为空,则终止程序,否则将其恢复到前台。
my-program | tee temp-file &
sleep 30
[ -s temp-file ] && kill $! || fg $!