我需要启动一个head
命令,该命令将等待几秒钟的输入,但如果没有到达,它将中止。 stdin
不得关闭(因为后面的输入仍可用于其他阅读过程。
我的第一种方法是使用标准超时模式:
head & pid=$! ; sleep 2; kill $pid
但不幸的是,当发送到后台时,head
将不再从stdin中读取任何内容。
接下来的方法是在后台执行超时功能:
(sleep 2; killall head) &
head
但这当然会杀死所有其他正在运行的head
进程;找到合适的人似乎很复杂。
有更好的方法吗?
答案 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
不会告诉我在超时的情况下读取的未完成数据。我也可以引入换行检测,但在我的情况下也会有特定的字节数。