Зависший спулер в отчётный период: как не дать одной задаче задушить печать
Бухгалтерия встала в отчётный период из-за зависшей очереди печати. Как диагностировать спулер, чистить застрявшие задания и настроить печать так, чтобы одна кривая задача не блокировала всё.
сетевые принт-серверы - массовый инструмент офисной печати
Звонок пришёл в середине дня, примерно за неделю до сдачи квартального отчёта. В бухгалтерии не печатает ни один принтер. Совсем. Четыре машины, два сетевых принтера на принт-сервере, ни один документ не выходит. Люди сидят и смотрят на экраны со статусом «печать», а из принтеров - тишина.
Это тот редкий случай, когда «не работает печать» означает буквально паралич отдела. Бухгалтеры не могут без бумаги: счета, акты, платёжки - всё нужно на руках. Приехали.
Что застряло и где
Первым делом - смотреть спулер на принт-сервере. Принт-сервер у клиента был отдельной машиной на Windows 2000 Server, к которой по сети подключены оба принтера. Открываем очередь на сервере: там висит задание, отправленное два часа назад. Статус - «печать». Принтер его не получает, следующие задания за ним не проходят. Классика.
Пробуем удалить задание через оснастку - не удаляется. Висит и молчит. Это означает, что оно уже не в очереди управляющей программы, оно ушло в спулер на уровне службы, и там застряло.
Порядок действий, который работает:
- Первое - остановить службу спулера. В Windows это
net stop spoolerиз командной строки или через Пуск - Администрирование - Службы. Всё равно ничего не печатается, хуже не будет. - Второе - открыть папку
C:\WINDOWS\system32\spool\PRINTERSи удалить там все файлы. Это физические файлы заданий:.SPL- само задание,.SHD- теневой файл с метаданными. Пока служба стоит, они мёртвые, удаляются без проблем. - Третье - поднять службу обратно:
net start spooler. - Четвёртое - проверить очередь: должна быть пуста.
Сделали - встало. Попросили бухгалтеров попробовать. Задания пошли, принтер ожил.
Откуда берётся застрявшее задание
Это вопрос, который мы задаём каждый раз, чтобы не возвращаться к тому же через неделю.
Чаще всего виновник - документ с кривым форматированием или битый файл, который драйвер принтера не смог переварить. Спулер начинает обрабатывать задание, буксует и зависает. Следующие задания встают в очередь за ним и ждут, пока первое не завершится - а оно не завершится никогда.
В этот раз выяснили: один из бухгалтеров пытался напечатать таблицу Excel с нестандартным шрифтом, которого на принт-сервере не было. Драйвер споткнулся, задание зависло, очередь встала. Шрифт скопировали на сервер, больше такого не случалось - но вывод шире: любой документ может стать такой миной.
Как сделать так, чтобы одно задание не роняло всё
Самая болезненная часть проблемы не в том, что очередь зависла, а в том, что она унесла с собой печать всего отдела. Есть несколько настроек, которые это смягчают.
Разделить принтеры по назначению. Если у бухгалтерии один принтер для всего - одно зависшее задание парализует всех. Когда принтеров два и они логически разделены (один для договоров и актов, другой для внутренних документов), одна зависшая очередь не останавливает работу полностью. У клиента принтеры были, но настроены как взаимозаменяемые - переключили модель, и у каждого отдела теперь есть приоритетный.
Поставить таймаут передачи задания. В свойствах принтера на сервере есть параметр - через сколько секунд считать передачу задания неуспешной. По умолчанию он либо огромный, либо вообще не выставлен. Мы ставим 120-180 секунд. Если за это время принтер не принял задание, оно помечается ошибкой и не блокирует следующие.
Логи спулера включить. По умолчанию Windows не пишет события спулера в журнал, и когда всё ломается, ничего не понятно. В настройках печати на сервере можно включить ведение журнала ошибок спулера - тогда хотя бы видно, в какой момент и на каком задании всё встало. Без этого управлять нечем.
Проверить, что шрифты и ресурсы документов есть на сервере. Если пользователи работают с документами, где используются нестандартные шрифты, эти шрифты должны быть установлены на принт-сервере. Без этого драйвер будет спотыкаться на таких заданиях снова и снова.
Про сетевую схему в целом
У клиента принт-сервер - отдельная машина, и это разумно для офиса с несколькими принтерами и десятком пользователей. Когда принтер подключён напрямую к рабочей станции кого-то из сотрудников и расшарен на отдел, при выключении этой станции печать пропадает у всех. Нормальная сетевая инфраструктура предполагает, что серверные роли не висят на пользовательских машинах.
Принт-сервер не требует дорогого железа: любая машина с Windows 2000 Server тянет десятки принтеров и сотни заданий в день без напряжения. Главное - чтобы это была выделенная роль, а не совмещённая с чем-то ещё. Когда спулер падает, ему перезапуск нужен быстро и без осторожностей, а если на той же машине крутится что-то важное, перезапуск службы становится процедурой с согласованиями.
Бухгалтерия в тот день доделала свои документы к вечеру. Отчёт сдали. Инцидент занял от звонка до первого напечатанного листа - чуть меньше часа, половину из которых мы ехали. Сама чистка спулера и проверка - пятнадцать минут. Время, которое потеряли люди, пока ждали, - несопоставимо больше.