2016-02-04 36 views
2

大家下午好,资源linux脚本,禁用/刷新额外输入

我已经创建了一个工作得很好的资源监视工具。

  • 拉CPU平均使用率
  • 拉平均内存占用
  • 即使计算NIC吞吐量%(如果你有一个千兆网卡,它会显示在一个时间进行处理百分比)...是的,我知道这是一个NIC的粗略估计/理论最大限制。

虽然我的脚本有一个问题。下面是我遇到我的问题的部分代码(为了简单起见,我将其转换为伪代码)。

COUNT=1 
read -rsp "When you are ready to begin, please press any key" -n1 
echo "processing" 
sleep 3 
while [ ${COUNT} = "1" ; do 
    read -t 1 -n 1 
    if [$? = 0 ] ; then 
    exit 0 
    else 
`Resource command` > ${cpulog} file for future graphs 
`Resource command` > ${memlog} file for future graphs 
`Resource command` > ${network} log file for future graphs 
`etc` 
fi 
done 

基本上,你按任意键来启动程序,只要按下键盘上的任意键在程序启动后(While循环),程序停止记录信息,并继续前进。

现在这个脚本的工作原理,并做我需要它做的一切。我碰到的问题是当你“按任意键”

请注意,在等待按键的脚本中有两点。

如果我按一次任意更在第一点,第二按键输入将获得由我read -t 1 -n 1命令处理(第二点),因此无法运行我的资源拉动。由于这种情况立即发生,脚本失败。

基本上,我试图弄清楚是否有一种方法可以在有限时间内关闭输入后,在有限时间内关闭输入,同时检索有限数量的数据,或者刷新在击中之前给出的任何输入read -t 1命令。谢谢。

+0

你只需要输入一个字符? –

+0

为了停止拉动资源信息,您可以按任意键停止程序。 – bluerojo

+0

为了启动程序,您还必须按任意键。问题在于,如果您通过意外击中多个按键来启动程序,则额外的按键笔划会发送到我的“读取-t 1”部分,并导致程序失败。 – bluerojo

回答

1

在“生产线”,添加以下循环:

# Eat any remaining input 
while read -t 1 -n 1 
do 
    # Do nothing here 
    : 
done 

# Continue processing now that all input has been consumed... 

这将增加约1秒的延迟,以启动(更多,如果用户正坐在那里按下键),但除此之外,你想要做什么。

+0

darn这些-1没有评论...希望我明白为什么这个答案值得-1这里。 – ash

+0

的代码不起作用,它仍然接受第二个值 –

+0

奇怪,我自己测试了一下。此代码在运行时会在其中输入,但在此之后不会再有任何输入...可以继续吗? – ash

2

该脚本可以调用一个用C,perl或类似语言编写的小程序,它在stdin上调用FIONREAD ioctl。

然后通过读取调用读取意外的额外字符,请参阅Perl Cookbook to determine unread bytes 您可以使用perl -e在命令行上实际输入perl代码。将它全部保存在bash脚本中。