外壳命令“head”超时



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

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

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

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

下一种方法是在后台进行超时操作:

(sleep 2; killall head) &
head

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

有更好的方法吗?

使用命名管道而不是STDIN

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

或者终止父脚本的PID:

PID=$$
(sleep 2; kill $PID) &
head
~$ timeout --help
Usage: timeout [OPTION] DURATION COMMAND [ARG]...
  or:  timeout [OPTION]
Start COMMAND, and kill it if still running after DURATION.

因此,您将运行timeout 2 head以在2秒后杀死head(同时由于head没有输入而不产生输出(

我现在使用的是:

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

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

最新更新