Shell命令`head`超时

时间:2013-04-26 09:57:04

标签: bash shell timeout head

我需要启动一个head命令,该命令将等待几秒钟的输入,但如果没有到达,它将中止。 stdin不得关闭(因为后面的输入仍可用于其他阅读过程。

我的第一种方法是使用标准超时模式:

head & pid=$! ; sleep 2; kill $pid

但不幸的是,当发送到后台时,head将不再从stdin中读取任何内容。

接下来的方法是在后台执行超时功能:

(sleep 2; killall head) &
head

但这当然会杀死所有其他正在运行的head进程;找到合适的人似乎很复杂。

有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

使用named pipe代替STDIN

mkfifo /tmp/mypipe

head /tmp/mypipe &
pid=$!
sleep 2
kill $pid

或者杀死父脚本的PID:

PID=$$
(sleep 2; kill $PID) &
head

答案 1 :(得分:2)

~$ timeout --help
Usage: timeout [OPTION] DURATION COMMAND [ARG]...
  or:  timeout [OPTION]
Start COMMAND, and kill it if still running after DURATION.

所以你会在2秒后运行timeout 2 head来杀死head(因为没有head输入而没有产生输出)

答案 2 :(得分:0)

我现在正在使用它:

for ((i=0; i<1000; i++))
do
  if IFS='' read -t 2 -N 1 a
  then
    echo -n "$a"
  else
    break
  fi
done

我一次读取一个字符,因为read不会告诉我在超时的情况下读取的未完成数据。我也可以引入换行检测,但在我的情况下也会有特定的字节数。