定期打印的脚本

定期打印的脚本

我有一台联网喷墨打印机 ( HP all-in-one photosmart 5510),目前我有一个简单的脚本,可以定期提醒我向打印机发送一个小作业,这样墨水就不会干涸。我使用的是 Ubuntu,并且打印机是从打印机 GUI 添加为网络打印机。

我的网络中还有一个始终处于开启状态的小型 Linux 盒子,我想将这个过程自动化为一个 cronjob,这样即使我不在家,它也能完成。

有没有一些从 bash 脚本打印图像(jpg)的好方法?还可以以某种方式从打印机查询作业历史记录(即检查上次打印作业的时间,如果超过 x 天,则发送文档进行打印)

答案1

PDF 成为标准打印格式已有一段时间了。一次性准备好 PDF 文件。您可以使用convert命令来自图像魔术师套房(无论是原来的或者图形魔术师变体)。

convert foo.jpg /path/to/foo.pdf

您可以在 中找到打印日志/var/log/cups/page_log。只有管​​理员帐户才能读取它们。旧日志位于名为 、 等的文件/var/log/cups/page_log.0/var/log/cups/page_log.1.gz日志条目看起来像这样:

printername 1234 julumme [date] 42 1 - localhost filename.pdf

这里我们只关心打印机名称和日期。日志条目将按时间顺序排列,因此我们需要获取与所需打印机相对应的最后一个条目。下面是执行此操作的 shell 代码片段,它将日期与当前日期进行比较并打印文件,除非在过去 7 天内打印过某些内容。替换photosmart为您为打印机指定的名称。警告:未经测试的代码。

#!/bin/sh
printer_name="photosmart"
last_date=$(
  { zcat /var/log/page_log.1.gz;
    cat /var/log/page_log.0 /var/log/page_log; } 2>/dev/null |
  awk '
      $1 == "photosmart" {sub(/\].*/, ""); sub(/.*\[/, ""); last_date = $0}
      END {print last_date}
  ')
if [ -n "$last_date" ]; then
  seconds_since_last_printing=$(($(date -d "$last_date" +%s) - $(date +%s)))
  if [ $seconds_since_last_printing -lt $((7*24*60*60)) ]; then
    # There was a recent print job
    exit
  fi
fi
lp -d "$printer_name" /path/to/foo.pdf

在每日(或不太频繁)的 cron 作业中运行此脚本。它需要以 root 身份运行,因为普通用户无法读取日志文件(除非您更改 CUPS 配置)。

如果您使用不同的打印机别名来打印单色和彩色作业,您将在日志中看到不同的别名。但是,如果您显式传递该选项,则可以使用颜色别名来打印黑白作业,反之亦然,因此这不是一个可靠的测试。

答案2

假设您已经设置了打印机并且您的 ubuntu 盒子正在使用cups,您可能需要查看一下命令行打印和选项。与 cronjob 结合使用,打印图像应该是一件简单的工作。

相关内容