Решил написать скриптик который бы хотя бы частично решал эту проблему.
Были установлены следующие случаи отказа в работе принтера:
1. Если система загрузилась с выключенным принтером, то при включении принтера требуется перезапуск демона ccpd чтоб он начал работать
2. При выключении принтера процесс captmon2 начинает жрать 100% процессора, лечится остановкой ccpd
3. При печати по не установленным причинам бывает процессы captmon2 и captfilter начинают жрать 100% проца. Лечится перезапуском ccpd. Иногда такое лечение не работатет так как после перезапуска ccpd captmon2 и captfilter опять начинают жрать 100% проц. Также бывает что в cups принтер оказывается остановленным.
Исходя из этих условий был написан скрипт. Который проверяет включился или выключился принтер и убивает процессы если они начинают жрать 100% проца. Проблемы не решенные скриптом (надеюсь вы мне поможите их решить)
1. Запуск принтера в cups если он вдруг оказался остановленным. (не знаю какой командой это можно сделать)
2. Причины по которым captmon2 и captfilter все равно продолжают жрать 100% после перезапуска ccpd
3. Во время работы скрипта в консоль рута сыпятся ошибки, кто знает как подавить вывод от скрипта подскажите.
Ну собственно сам текст скрипта. (предупреждаю, я не программист, поэтому на красоту решений внимание не обращайте или поправите если можете)
Код: Выделить всё
#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas
# убить captmon и captfilter и рестартонуть cups и ccpd
function kill_restart {
captmon=$(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17)
captfilter=$(ps aux | grep -s captfilter | grep -v grep | cut -c 16-17)
if let "$captmon>50"; then
kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
elif let "$captfilter>50"; then
kill -s 9 $(pidof captfilter) && service cups stop && service ccpd stop && service cups start && service ccpd start
fi
}
# убить captmon и captfilter и остановить ccpd
function kill_stop {
captmon=$(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17)
captfilter=$(ps aux | grep -s captfilter | grep -v grep | cut -c 16-17)
if let "$captmon>50"; then
kill -s 9 $(pidof captmon2) && service ccpd stop
elif let "$captfilter>50"; then
kill -s 9 $(pidof captfilter) && service ccpd stop
fi
}
while sleep 3
do
canon_old=$(cat /tmp/canon)
case $(ls /dev/usb/lp0 > /dev/null && echo 1 || echo 0) in # проверка состояния принтера
1) echo 1 > /tmp/canon; canon_new=1;;
0) echo 0 > /tmp/canon; canon_new=0;;
esac
canon=$(echo $canon_old$canon_new)
case $canon in
01) service cups start && service ccpd start;; # был выключен - включился, старт ccpd и cups
10) kill_stop;; # был включен - выключился, убить процессы captmon и captfilter и остановить ccpd
11) kill_restart;; # все время пока включен контролировать загрузку процессора процессами captmon и captfilter
esac
done
Для запуска ссылка на скрипт была вставлена в /etc/boot.local