2015-03-03 75 views
0

我从udev规则运行下面的脚本,这样当我启动打印机时,它会查找墨盒中的剩余墨水,并通过这些信息查看电子邮件。总的来说,它运行良好,除了escputil命令输出数据相当缓慢。因此,我的中间“out”文件是空的,并且通知电子邮件也是空的。Bash脚本:将慢速命令的输出重定向到文件

我试过stdbuf来修复它,标准的重定向或tee,没有帮助。 有什么想法?在此先感谢,

#!/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 protected] 
echo "$now" > /tmp/epson.ink 

rmdir /var/lock/epson 
exit 0 
+0

so'escputil'在'out'文件被写入之前终止? – 2015-03-03 12:54:33

+1

命令的运行速度有多慢并不重要。如果它写入'stdout',管道会在命令返回前将其捕获并写入文件。你确定'escputil'不是写给'stderr'而是写什么的? – 2015-03-03 12:58:25

+0

不,因为如果我在shell上运行这个命令,我得到了输出。如果它打印到标准错误,重定向到/ dev/null,我不会看到任何输出。 – 2015-03-03 13:39:01

回答

0

escputil(1)提到,在启动时,打印机可能不会立即返回结果的手册页的BUGS部分。

我会建议重复该命令并在每次尝试后检查输出。在这个例子中,我假设/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将是有益的您。

+0

确实有效,escputil的多个符文,我得到了预期的电子邮件:)感谢您的提示! – 2015-03-03 21:36:33

+0

很高兴听到!不用谢。 – 2015-03-03 21:37:19

相关问题