![作业滞留在打印服务器上的打印队列中](https://linux22.com/image/515988/%E4%BD%9C%E4%B8%9A%E6%BB%9E%E7%95%99%E5%9C%A8%E6%89%93%E5%8D%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84%E6%89%93%E5%8D%B0%E9%98%9F%E5%88%97%E4%B8%AD.png)
我有一台 Server 2003 机器,用作大约 20 台打印机的打印服务器。有一台打印机出现了问题,它的队列中有 104 个文档。
我尝试过“取消所有文档”并尝试手动取消单个文档,但没有成功。
打印作业的状态为“正在删除 - 已发送至打印机”。该状态已持续约 2 小时。
我不相信重新启动后台打印程序是一种不影响其他打印机的选项,并且我们已将打印机保留在特定的非 Windows 打印友好应用程序,在该应用程序中我不能丢失作业。
答案1
重新启动打印后台处理程序通常不会丢弃打印作业,只是停止接受新作业。最终用户会注意到,但不会像悄无声息地丢弃打印作业那么糟糕。一般来说,我认为在运行中重新启动服务是安全的。
更重要的是我想与你们分享这一点:
偶尔我也会遇到打印机队列中损坏的打印作业。在这些情况下,我注意到
a. 只要存在损坏的打印作业并且目标打印机处于打开状态,打印后台处理程序就不会保持启动状态
b. 如果后台处理程序停止,则打印后台处理程序不会让您通过 GUI 删除损坏的作业
c. 在损坏的作业完成或删除之前,打印机不会打印任何其他作业。
要解决这个问题你必须
- 物理关闭打印机
- 启动/重新启动打印后台处理程序
- 删除损坏的打印作业
- 打开打印机
如果您没有严格按照顺序执行 1-4,您将陷入与 ac 的无限循环斗争中。
我无法保证您的情况与此经历相符,但我认为值得考虑观察到的行为以及打印/打印后台处理过程如何处理事物的影响。
编辑:与 Evan 对假脱机文件的操作相反。您可以使用 Windows 上的打印队列(开始 - 设置 - 打印机或开始 - 打印机),然后使用文档菜单 - 取消选项从打印队列中删除该作业。
关键在于他处理这个问题的方式,必须停止后台处理服务,而我处理这个问题的方式,必须启动后台处理程序。如果您可以物理访问打印机,并且关闭打印机很方便,您可以使用我的方法。如果您无法访问物理打印机,您可以使用他的方法。
答案2
据我所知,退出后台处理程序服务是唯一可行的选择。根据我的经验,有些作业在队列中“堵塞”得非常“严重”,以至于需要停止后台处理程序服务器,清除 %SystemRoot%\System32\Spool\Printers 文件夹中代表这些作业的文件,然后重新启动后台处理程序服务。
通过退出后台处理程序服务,您不会丢失任何已经排队等待其他打印机的作业(您可以在另一台服务器或客户端上亲自演示这一点 - 暂停打印机,将一些作业放入队列,然后停止/重新启动后台处理程序服务),但如果您发现必须从后台处理目录中删除作业文件,那么您将很难在您想要保留的作业的其他后台处理文件中找到它们。
(顺便说一句:微软可以做一个很多我认为,打印后台处理程序服务的增强可以缓解您所看到的情况。在 Windows 的最近几个版本中,打印后台处理程序服务一直处于相对较少增强的状态。打印并不性感,但它通常对业务至关重要。)
编辑:
每个打印作业在假脱机目录中由一个“.SPL”文件(包含 EMF 或原始格式的打印作业数据)和一个匹配的“.SHD”文件表示,后者包含有关该作业的“标头”信息。此标头信息文件包含有关该作业将发送到哪台打印机的详细信息。
删除给定打印作业的匹配的“SPL”和“SHD”文件对会有效地删除该作业。
不幸的是,“.SHD”文件的格式没有正式记录(参见http://www.undocprint.org/formats/winspool/shd对于某些逆向工程文档),因此找出假脱机目录中的“哪个文件是哪个”并仅删除“损坏的”打印作业非常困难。据我所知,目标打印队列名称在该“SHD”文件中作为未编码字符串,因此我认为可以使用命令行工具行“strings”和“findstr”拼凑一个脚本来遍历所有“.SHD”文件以查找发往“问题”打印机的作业并删除它们,同时保持发往其他打印机的作业不变。
对假脱机文件的任何操作都必须在假脱机服务停止的情况下进行,因为在假脱机服务运行时,文件是被锁定的。