2015-03-03 80 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

相關問題