Bash 脚本:将慢速命令的输出重定向到文件

Bash scripting: redirect output of slow commands to file

我是 运行 来自 udev 规则的以下脚本,因此当我启动打印机时,它会查找墨盒中的剩余墨水并发送包含这些信息的电子邮件。总的来说,它运行良好,除了 escputil 命令输出数据非常慢。因此,我的中间 "out" 文件是空的,通知邮件也是空的。

我试过 stdbuf 来修复它,标准重定向或 tee,none 帮助。 任何想法?提前致谢,

#!/bin/sh

mkdir /var/lock/epson || exit 1
now=`date +%s`
limit=$((now - 1800))

if [ -f /tmp/epson.ink ] && [ `cat /tmp/epson.ink` -ge $limit ]; then
    rmdir /var/lock/epson && exit 0
fi
sleep 6

stdbuf -oL -eL escputil --quiet --ink-level --raw-device /dev/usb/lp0 2>/dev/null | tee /tmp/epson.out
cat /tmp/epson.out | tail -5 | mail -s "Epson printer ink level" email@example.com
echo "$now" > /tmp/epson.ink

rmdir /var/lock/epson
exit 0

联机帮助页 escputil(1) 中的 BUGS 部分提到打印机在启动时可能不会 return 立即产生结果。

我建议重复该命令并在每次尝试后检查输出。在这个例子中,我假设脚本启动时 /tmp/epson.out 不存在或为空(否则在开头添加 rm -rf):

# as long as the file does not exist or is empty:
while ! [ -e /tmp/epson.out ] || [ $( wc -m < /tmp/epson.out ) -le 0 ]
do 
  escputil --quiet --ink-level --raw-device /dev/usb/lp0 2>/dev/null | tee /tmp/epson.out
  sleep 5
done

我无法在这里测试,但我认为 stdbuf 对你没有用。