【问题标题】:Bash scripting: redirect output of slow commands to fileBash 脚本:将慢速命令的输出重定向到文件
【发布时间】:2015-03-03 12:41:50
【问题描述】:

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

我尝试了 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@example.com
echo "$now" > /tmp/epson.ink

rmdir /var/lock/epson
exit 0

【问题讨论】:

  • 所以escputil 在写入out 文件之前终止?
  • 命令运行的速度有多慢并不重要。如果它写入stdout,管道将在命令返回之前捕获它并将其写入文件。你确定escputil 没有写信给stderr 吗?
  • 不,因为如果我在 shell 上运行这个命令,我会得到输出。如果它打印到 stderr,并重定向到 /dev/null,我将看不到任何输出。
  • 当您完全按照脚本的方式手动运行命令时会发生什么。即使用重定向和发球台?
  • 它按预期工作;我在控制台和文件中有输出。

标签: bash output buffer


【解决方案1】:

手册页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 对你没有用处。

【讨论】:

  • 确实有效,escputil 的多个符文,我收到了预期的电子邮件 :) 感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
相关资源
最近更新 更多