我有一台联网喷墨打印机 ( 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 结合使用,打印图像应该是一件简单的工作。