Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных (Написал скриптик для ccpd. подработайте)

Всё о принтерах, сканерах и многофункциональных устройствах. Подключение, настройка, проблемы.

Модератор: Модераторы разделов

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

Вообщем проблема с этими принтерами всем известна, вроде бы работают, а вроде бы и нет.
Решил написать скриптик который бы хотя бы частично решал эту проблему.
Были установлены следующие случаи отказа в работе принтера:
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
OS: SUSE 11.0 x86
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

вот немного подредактировал вроде половчее

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# убить captmon и captfilter и рестартонуть cups и ccpd
function kill_restart {
    if let "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17)" > "50"; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
cupsenable LBP2900
}

# убить captmon и captfilter  и остановить ccpd
function kill_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter) && service cups stop && service ccpd stop
    fi
}

while sleep 3
do
canon_old=$(cat /tmp/canon)
if test -c /dev/usb/lp0; then # проверка состояния принтера
    echo 1 > /tmp/canon
    canon_new=1
else
    echo 0 > /tmp/canon
    canon_new=0
fi

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
    00) kill_stop;;
esac
done
OS: SUSE 11.0 x86
Спасибо сказали:

Flaming
Сообщения: 2579

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Flaming »

Dimbas, и насколько успешно работает?
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

ну у меня пока работает. Принтер пока не отказывал. Хотя я не много печатаю поэтому и выложил чтоб другие протестировали и отписались какие еще есть косяки.
OS: SUSE 11.0 x86
Спасибо сказали:

Flaming
Сообщения: 2579

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Flaming »

Будет время - попробую - один раз у меня получилось, только проблема была в загрузке процессора чрезмерной. И я бросил. Потом ещё попробую...
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

Вот последний вариант скрипта. Мне нравиться как работает ))

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# Предустановки
TIME=3 # время через которое срабатывет скрипт
NAME_PRINT=LBP2900 # имя принтера в cups

# Определение первоночального состояния принтера
if test -c /dev/usb/lp0; then
    echo 1 > /tmp/canon # принтер включен, старт ccpd
    service ccpd restart
else
    echo 0 > /tmp/canon # принтер выключен, стоп ccpd
    service ccpd stop
fi

# убить captmon и captfilter и рестартонуть cups и ccpd
function ccpd_restart {
    if let $(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    elif let $(ps aux | grep -s ccpd | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof ccpd) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
    cupsenable $NAME_PRINT
}

# убить captmon и captfilter  и остановить ccpd
function ccpd_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2)
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter)
    elif test -n "$(ps aux | grep -s ccpd$ | grep -v grep | cut -c 1-4)"; then
        service ccpd stop || kill -s 9 $(pidof ccpd)
    fi
}

while sleep $TIME
do
    canon_old=$(cat /tmp/canon)
    if test -c /dev/usb/lp0; then # проверка состояния принтера
        echo 1 > /tmp/canon
        canon_new=1
    else
        echo 0 > /tmp/canon
        canon_new=0
    fi

    canon=$(echo $canon_old$canon_new)

    case $canon in
        01) service cups start && service ccpd start;; # был выключен - включился, старт ccpd и cups
        10) ccpd_stop;; # был включен - выключился, убить процессы captmon и captfilter и остановить ccpd
        11) ccpd_restart;; # все время пока включен контролировать загрузку процессора процессами  captmon и captfilter
        00) ccpd_stop;;
    esac
done
OS: SUSE 11.0 x86
Спасибо сказали:

Аватара пользователя
cannabius
Сообщения: 10
ОС: Mandriva Linux 2010.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение cannabius »

Я в программировании не силен,а как бы выглядел скрипт без отсечки ccpd, жрущего 50% ресурсов процессора? - мне такой нужен. :blush:
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

вот так

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# Предустановки
TIME=3 # время через которое срабатывет скрипт
NAME_PRINT=LBP2900 # имя принтера в cups

# Определение первоночального состояния принтера
if test -c /dev/usb/lp0; then
    echo 1 > /tmp/canon # принтер включен, старт ccpd
    service ccpd restart
else
    echo 0 > /tmp/canon # принтер выключен, стоп ccpd
    service ccpd stop
fi

# убить captmon и captfilter и рестартонуть cups и ccpd
function ccpd_restart {
    if let $(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
    cupsenable $NAME_PRINT
}

# убить captmon и captfilter  и остановить ccpd
function ccpd_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2)
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter)
    elif test -n "$(ps aux | grep -s ccpd$ | grep -v grep | cut -c 1-4)"; then
        service ccpd stop || kill -s 9 $(pidof ccpd)
    fi
}
OS: SUSE 11.0 x86
Спасибо сказали:

Аватара пользователя
cannabius
Сообщения: 10
ОС: Mandriva Linux 2010.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение cannabius »

Заменил скрипт на последний - принтер не печатает вообще :( Оживляется только если его отсоединить от компа, перезапустить cups, присоединить, ccpd start
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

Извеняюсь при копировании не все выделилось

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# Предустановки
TIME=3 # время через которое срабатывет скрипт
NAME_PRINT=LBP2900 # имя принтера в cups

# Определение первоночального состояния принтера
if test -c /dev/usb/lp0; then
    echo 1 > /tmp/canon # принтер включен, старт ccpd
    service ccpd restart
else
    echo 0 > /tmp/canon # принтер выключен, стоп ccpd
    service ccpd stop
fi

# убить captmon и captfilter и рестартонуть cups и ccpd
function ccpd_restart {
    if let $(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
    cupsenable $NAME_PRINT
}

# убить captmon и captfilter  и остановить ccpd
function ccpd_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2)
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter)
    elif test -n "$(ps aux | grep -s ccpd$ | grep -v grep | cut -c 1-4)"; then
        service ccpd stop || kill -s 9 $(pidof ccpd)
    fi
}

while sleep $TIME
do
    canon_old=$(cat /tmp/canon)
    if test -c /dev/usb/lp0; then # проверка состояния принтера
        echo 1 > /tmp/canon
        canon_new=1
    else
        echo 0 > /tmp/canon
        canon_new=0
    fi

    canon=$(echo $canon_old$canon_new)

    case $canon in
        01) service cups start && service ccpd start;; # был выключен - включился, старт ccpd и cups
        10) ccpd_stop;; # был включен - выключился, убить процессы captmon и captfilter и остановить ccpd
        11) ccpd_restart;; # все время пока включен контролировать загрузку процессора процессами  captmon и captfilter
        00) ccpd_stop;;
    esac
done
OS: SUSE 11.0 x86
Спасибо сказали:

Аватара пользователя
cannabius
Сообщения: 10
ОС: Mandriva Linux 2010.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение cannabius »

Dimbas писал(а):
12.12.2009 05:29
Извеняюсь при копировании не все выделилось

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# Предустановки
TIME=3 # время через которое срабатывет скрипт
NAME_PRINT=LBP2900 # имя принтера в cups

# Определение первоночального состояния принтера
if test -c /dev/usb/lp0; then
    echo 1 > /tmp/canon # принтер включен, старт ccpd
    service ccpd restart
else
    echo 0 > /tmp/canon # принтер выключен, стоп ccpd
    service ccpd stop
fi

# убить captmon и captfilter и рестартонуть cups и ccpd
function ccpd_restart {
    if let $(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
    cupsenable $NAME_PRINT
}

# убить captmon и captfilter  и остановить ccpd
function ccpd_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2)
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter)
    elif test -n "$(ps aux | grep -s ccpd$ | grep -v grep | cut -c 1-4)"; then
        service ccpd stop || kill -s 9 $(pidof ccpd)
    fi
}

while sleep $TIME
do
    canon_old=$(cat /tmp/canon)
    if test -c /dev/usb/lp0; then # проверка состояния принтера
        echo 1 > /tmp/canon
        canon_new=1
    else
        echo 0 > /tmp/canon
        canon_new=0
    fi

    canon=$(echo $canon_old$canon_new)

    case $canon in
        01) service cups start && service ccpd start;; # был выключен - включился, старт ccpd и cups
        10) ccpd_stop;; # был включен - выключился, убить процессы captmon и captfilter и остановить ccpd
        11) ccpd_restart;; # все время пока включен контролировать загрузку процессора процессами  captmon и captfilter
        00) ccpd_stop;;
    esac
done


Не работает.
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

вот этот скрип запустите просто в консоли от рута. Предыдущий скрипт удалите из загрузки и перегрузитесь (или убейте процес скрипта). После запуска того скрипта у вас должны появляться сообщение о работе скрипта.

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# Предустановки
TIME=3 # время через которое срабатывет скрипт
NAME_PRINT=LBP2900 # имя принтера в cups

# Определение первоночального состояния принтера
if test -c /dev/usb/lp0; then
    echo 1 > /tmp/canon # принтер включен, старт ccpd
    service ccpd restart
else
    echo 0 > /tmp/canon # принтер выключен, стоп ccpd
    service ccpd stop
fi

# убить captmon и captfilter и рестартонуть cups и ccpd
function ccpd_restart {
    if let $(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
    cupsenable $NAME_PRINT
    echo "ccpd and cups restart ok"
}

# убить captmon и captfilter  и остановить ccpd
function ccpd_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2)
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter)
    elif test -n "$(ps aux | grep -s ccpd$ | grep -v grep | cut -c 1-4)"; then
        service ccpd stop || kill -s 9 $(pidof ccpd)
    fi
    echo "ccpd kill ok"
}

while sleep $TIME
do
    canon_old=$(cat /tmp/canon)
    if test -c /dev/usb/lp0; then # проверка состояния принтера
        echo 1 > /tmp/canon
        canon_new=1
    else
        echo 0 > /tmp/canon
        canon_new=0
    fi

    canon=$(echo $canon_old$canon_new)

    case $canon in
        01) service cups start && service ccpd start && echo "был выключен - включился, старт ccpd и cups";;
        10) ccpd_stop && echo "был включен - выключился, убить процессы captmon и captfilter и остановить ccpd";;
        11) ccpd_restart && echo "все время пока включен контролировать загрузку процессора процессами  captmon и captfilter";;
        00) ccpd_stop && echo "ccpd stop";;
    esac
done
OS: SUSE 11.0 x86
Спасибо сказали:

Boroda43
Сообщения: 13
ОС: Debian 5.03

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Boroda43 »

Dimbas писал(а):
13.12.2009 07:00
вот этот скрип запустите просто в консоли от рута. Предыдущий скрипт удалите из загрузки и перегрузитесь (или убейте процес скрипта). После запуска того скрипта у вас должны появляться сообщение о работе скрипта.

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# Предустановки
TIME=3 # время через которое срабатывет скрипт
NAME_PRINT=LBP2900 # имя принтера в cups

# Определение первоночального состояния принтера
if test -c /dev/usb/lp0; then
    echo 1 > /tmp/canon # принтер включен, старт ccpd
    service ccpd restart
else
    echo 0 > /tmp/canon # принтер выключен, стоп ccpd
    service ccpd stop
fi

# убить captmon и captfilter и рестартонуть cups и ccpd
function ccpd_restart {
    if let $(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
    cupsenable $NAME_PRINT
    echo "ccpd and cups restart ok"
}

# убить captmon и captfilter  и остановить ccpd
function ccpd_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2)
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter)
    elif test -n "$(ps aux | grep -s ccpd$ | grep -v grep | cut -c 1-4)"; then
        service ccpd stop || kill -s 9 $(pidof ccpd)
    fi
    echo "ccpd kill ok"
}

while sleep $TIME
do
    canon_old=$(cat /tmp/canon)
    if test -c /dev/usb/lp0; then # проверка состояния принтера
        echo 1 > /tmp/canon
        canon_new=1
    else
        echo 0 > /tmp/canon
        canon_new=0
    fi

    canon=$(echo $canon_old$canon_new)

    case $canon in
        01) service cups start && service ccpd start && echo "был выключен - включился, старт ccpd и cups";;
        10) ccpd_stop && echo "был включен - выключился, убить процессы captmon и captfilter и остановить ccpd";;
        11) ccpd_restart && echo "все время пока включен контролировать загрузку процессора процессами  captmon и captfilter";;
        00) ccpd_stop && echo "ccpd stop";;
    esac
done


Т. е. насколько я понял этот скрипт вместо ccpd запускаем? То есть можно просто его в ccpd запихнуть и также запустить? или обязательно прописывать в скрипт загрузки
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

нет не вместо ccpd, а вместе. Он контролирует состояние ccpd и останавливает его или перезапускает.
OS: SUSE 11.0 x86
Спасибо сказали:

Boroda43
Сообщения: 13
ОС: Debian 5.03

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Boroda43 »

Dimbas писал(а):
15.12.2009 14:57
нет не вместо ccpd, а вместе. Он контролирует состояние ccpd и останавливает его или перезапускает.

То есть если я его добавлю /etc/init.d/ccpd_new и сделаю update-rc.d ccpd_new default 20 То этого хватит?
Спасибо сказали:

Аватара пользователя
cannabius
Сообщения: 10
ОС: Mandriva Linux 2010.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение cannabius »

Dimbas писал(а):
13.12.2009 07:00
вот этот скрип запустите просто в консоли от рута. Предыдущий скрипт удалите из загрузки и перегрузитесь (или убейте процес скрипта). После запуска того скрипта у вас должны появляться сообщение о работе скрипта.

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# Предустановки
TIME=3 # время через которое срабатывет скрипт
NAME_PRINT=LBP2900 # имя принтера в cups

# Определение первоночального состояния принтера
if test -c /dev/usb/lp0; then
    echo 1 > /tmp/canon # принтер включен, старт ccpd
    service ccpd restart
else
    echo 0 > /tmp/canon # принтер выключен, стоп ccpd
    service ccpd stop
fi

# убить captmon и captfilter и рестартонуть cups и ccpd
function ccpd_restart {
    if let $(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
    cupsenable $NAME_PRINT
    echo "ccpd and cups restart ok"
}

# убить captmon и captfilter  и остановить ccpd
function ccpd_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2)
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter)
    elif test -n "$(ps aux | grep -s ccpd$ | grep -v grep | cut -c 1-4)"; then
        service ccpd stop || kill -s 9 $(pidof ccpd)
    fi
    echo "ccpd kill ok"
}

while sleep $TIME
do
    canon_old=$(cat /tmp/canon)
    if test -c /dev/usb/lp0; then # проверка состояния принтера
        echo 1 > /tmp/canon
        canon_new=1
    else
        echo 0 > /tmp/canon
        canon_new=0
    fi

    canon=$(echo $canon_old$canon_new)

    case $canon in
        01) service cups start && service ccpd start && echo "был выключен - включился, старт ccpd и cups";;
        10) ccpd_stop && echo "был включен - выключился, убить процессы captmon и captfilter и остановить ccpd";;
        11) ccpd_restart && echo "все время пока включен контролировать загрузку процессора процессами  captmon и captfilter";;
        00) ccpd_stop && echo "ccpd stop";;
    esac
done



- Отлично работает (тестил 30 минут простоя после последней печати)! Ставил просто: Копировал в текстовик, затем перемещал в /usr/bin/ (удалив предыдущий скрипт), в /etc/rc.local предпоследней строчкой путь до скрипта, chmod 777 на скрипт - ребут с вкл. принтером, радость! Утром проведу тест на 6 машинах - отпишусь. :happy:
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

То есть если я его добавлю /etc/init.d/ccpd_new и сделаю update-rc.d ccpd_new default 20 То этого хватит?

ну если в Дебиане так добавляются скрипты в автозапуск то да. А вообще нужно просто в /etc/boot/local или аналогичный файл добавить ссылку на скрипт.
OS: SUSE 11.0 x86
Спасибо сказали:

masan
Сообщения: 3

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение masan »

в общем скрипт работает. автору - респект. :drinks:
непонятно одно: его на время печати запускать, или он все время будет болтаться и чегототам делать? у меня он не останавливается сам, все время чегото пытается выполнить.
и выдает такую вот инфу:

Код: Выделить всё

Shutting down /usr/sbin/ccpd:
Starting /usr/sbin/ccpd: .
./canon_ccpd_control: line 20: let: expression expected
ccpd and cups restart ok
все время пока включен контролировать загрузку процессора процессами  captmon и captfilter
./canon_ccpd_control: line 20: let: expression expected
ccpd and cups restart ok
все время пока включен контролировать загрузку процессора процессами  captmon и captfilter
./canon_ccpd_control: line 20: let: expression expected
ccpd and cups restart ok
......

и так пока его не остановишь вручную.
или другой случай:

Код: Выделить всё

  Shutting down /usr/sbin/ccpd:
ccpd kill ok
ccpd stop
ccpd kill ok
ccpd stop
ccpd kill ok
ccpd stop
ccpd kill ok
ccpd stop
ccpd kill ok
ccpd stop
ccpd kill ok
ccpd stop
.....

это случай для отключенного принтера. долбит остановку процесса ccpd, пока скрипт не остановишь вручную.
вопрос такой: как этот скрипт подправить для системы suse 11.2 и как его правильно вставить в автозагрузку, у меня ниче не вышло)))

вот тока увидел интересную штуку при подключении принтера к компу:

Код: Выделить всё

[ 4662.768130] usb 3-1: new full speed USB device using uhci_hcd and address 2
[ 4662.946210] usb 3-1: New USB device found, idVendor=04a9, idProduct=262b
[ 4662.946266] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 4662.946313] usb 3-1: Product: Canon CAPT USB Printer
[ 4662.946348] usb 3-1: Manufacturer: Canon
[ 4662.946379] usb 3-1: SerialNumber: 0133G8V3
[ 4662.946944] usb 3-1: configuration #1 chosen from 1 choice
[ 4663.152586] usblp0: USB Bidirectional printer dev 2 if 0 alt 0 proto 2 vid 0x04A9 pid 0x262B
[ 4663.152762] usbcore: registered new interface driver usblp
[ 4666.803973] lp: driver loaded but no devices found
[ 4666.969256] ppdev: user-space parallel port driver
[ 5093.024209] usblp0: nonzero read bulk status received: -84
[ 5093.096158] usb 3-1: USB disconnect, address 2
[ 5093.173191] ccpd[6316]: segfault at d ip 08050222 sp bff54850 error 4 in ccpd[8048000+c000]
[ 5910.016097] usb 3-1: new full speed USB device using uhci_hcd and address 3
[ 5910.200181] usb 3-1: New USB device found, idVendor=04a9, idProduct=262b
[ 5910.200224] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5910.200258] usb 3-1: Product: Canon CAPT USB Printer
[ 5910.200285] usb 3-1: Manufacturer: Canon
[ 5910.200308] usb 3-1: SerialNumber: 0133G8V3
[ 5910.200703] usb 3-1: configuration #1 chosen from 1 choice
[ 5910.207447] usblp0: USB Bidirectional printer dev 3 if 0 alt 0 proto 2 vid 0x04A9 pid 0x262B
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

и выдает такую вот инфу:

это пока не знаю как победить
или другой случай:

возьмите версию скрипта постом выше, последняя это для отладки чтобы видеть что делает скрипт.
вообще скрипт должен работать постоянно, много ресурсов он не потребляет, срабатывает раз в 3 сек. Время можно изменить, параметр TIME в скрипте.
ДЛя SUSE 11.2 точно не скажу, но судя по вашему dmesg он определяется как /dev/usblp0, а в 11 было /dev/usb/lp0. Посмотрите какое устройство появляется когда включается принтер и измените ссылку в скрипте на правильную

Вот новая версия. параметр DEVPRINT можно изменить на такое как у вас в системе определяется принтер

Код: Выделить всё

#! /bin/sh
# костыль для сервиса ccpd принтеров Canon
# Автор Dimbas

# Предустановки
TIME=3 # время через которое срабатывет скрипт
NAME_PRINT=LBP2900 # имя принтера в cups
DEVPRINT=/dev/usp/lp0 #устройство принтера

# Определение первоночального состояния принтера
if test -c $DEVPRINT; then
    echo 1 > /tmp/canon # принтер включен, старт ccpd
    service ccpd restart
else
    echo 0 > /tmp/canon # принтер выключен, стоп ccpd
    service ccpd stop
fi

# убить captmon и captfilter и рестартонуть cups и ccpd
function ccpd_restart {
    if let $(ps aux | grep -s captmon2 | grep -v grep | cut -c 16-17) > 50; then
        kill -s 9 $(pidof captmon2) && service cups stop && service ccpd stop && service cups start && service ccpd start
    fi
    cupsenable $NAME_PRINT
    echo "ccpd and cups restart ok"
}

# убить captmon и captfilter  и остановить ccpd
function ccpd_stop {
    if test -n "$(ps aux | grep -s captmon2 | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captmon2)
    elif test -n "$(ps aux | grep -s captfilter | grep -v grep | cut -c 1-4)"; then
        kill -s 9 $(pidof captfilter)
    elif test -n "$(ps aux | grep -s ccpd$ | grep -v grep | cut -c 1-4)"; then
        service ccpd stop || kill -s 9 $(pidof ccpd)
    fi
    echo "ccpd kill ok"
}

while sleep $TIME
do
    canon_old=$(cat /tmp/canon)
    if test -c $DEVPRINT; then # проверка состояния принтера
        echo 1 > /tmp/canon
        canon_new=1
    else
        echo 0 > /tmp/canon
        canon_new=0
    fi

    canon=$(echo $canon_old$canon_new)

    case $canon in
        01) service cups start && service ccpd start && echo "был выключен - включился, старт ccpd и cups";;
        10) ccpd_stop && echo "был включен - выключился, убить процессы captmon и captfilter и остановить ccpd";;
        11) ccpd_restart && echo "все время пока включен контролировать загрузку процессора процессами  captmon и captfilter";;
        00) ccpd_stop && echo "ccpd stop";;
    esac
done
OS: SUSE 11.0 x86
Спасибо сказали:

masan
Сообщения: 3

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение masan »

попробовал еще один костыль через udev.
идея отсюда: OpenNET
добавил в /ect/udev/rules.d файл 10-canon_LBP1120.rules, выключил загрузку ccpd и получил интересную вещь: включаем комп, подключаем принтер и все хорошо - печатает. никаких процессов грузящих систему не наблюдается. выключаем (отсоединяем) принтер и получаем новый процесс captmon который грузит систему на 50%, подключаем (включаем) принтер - нормально печатает, отключаем принтер и получаем еще один новый процесс captmon....и так до бесконечности. поразвлекался я пол дня и понял, что чегото тут не так. вот только чего???
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

это косяки работы драйвера принтера. Процессы captmon, captfilter, ccpd имеют свойство зависать и отжирать много процессорного времени. Напрмер если при выключенном принтере перезапустить ccpd то получите процесс caprtmon жрущий от 50 до 100%. Мой скрип отслеживает это и убивает эти процессы. (кроме captfilter он отвечает за задание на печать)
OS: SUSE 11.0 x86
Спасибо сказали:

Аватара пользователя
Svetlana2008
Сообщения: 196
Статус: Силиконо-кремнивая блондинка
ОС: М* - такое некультурное слово!

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Svetlana2008 »

C этим Сanon`ом 1120 я уже скоро чокнусь, наверное. Когда-то я спрашивала на форуме, как его запустить, то никто ничего вразумительного мне не сказал. Устанавливаю драйвера, перезапускаю СUPS, при попытке печатать - только растёт поставленных в очередь заданий. Но стоит только выключить комп при включённом Каноне - он незамедлительно выплевывает один единственный лист без каких либо следов печати.
P.S. На Windows принтер работает. Только из за него её приходится держать.
"А у меня самая-самая красивая попа!" (с)
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

А вы точно по инструкции ставите драйвер?
OS: SUSE 11.0 x86
Спасибо сказали:

Аватара пользователя
Svetlana2008
Сообщения: 196
Статус: Силиконо-кремнивая блондинка
ОС: М* - такое некультурное слово!

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Svetlana2008 »

Точнее не придумать
"А у меня самая-самая красивая попа!" (с)
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

а captstatusui работатет?
OS: SUSE 11.0 x86
Спасибо сказали:

Аватара пользователя
Svetlana2008
Сообщения: 196
Статус: Силиконо-кремнивая блондинка
ОС: М* - такое некультурное слово!

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Svetlana2008 »

Dimbas писал(а):
19.12.2009 11:35
а captstatusui работатет?

А что это и где его смотрят?
"А у меня самая-самая красивая попа!" (с)
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

это монитор работы принтера. Наберите в консоли captstatusui -P [printer name] . Имя принтера должно быть таким как вы указали при установке драйвера
OS: SUSE 11.0 x86
Спасибо сказали:

Аватара пользователя
Svetlana2008
Сообщения: 196
Статус: Силиконо-кремнивая блондинка
ОС: М* - такое некультурное слово!

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Svetlana2008 »

captstatusui -P

вот что выдаёт

*** captstatusui Error: No Specified Printer ***
"А у меня самая-самая красивая попа!" (с)
Спасибо сказали:

Dimbas
Сообщения: 138
ОС: openSUSE 11.0

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Dimbas »

значит принтер не установлен правильно. Посмотрите внимательно инструкцию которая идет вместе с дровами и сделайте все так. Вывод команд при установке скинте сюда посмотрим.
OS: SUSE 11.0 x86
Спасибо сказали:

Boroda43
Сообщения: 13
ОС: Debian 5.03

Re: Костыль для принтеров Canon LBP 2900, 3000, 5000 и подобных

Сообщение Boroda43 »

masan писал(а):
18.12.2009 17:17
попробовал еще один костыль через udev.
идея отсюда: OpenNET
добавил в /ect/udev/rules.d файл 10-canon_LBP1120.rules, выключил загрузку ccpd и получил интересную вещь: включаем комп, подключаем принтер и все хорошо - печатает. никаких процессов грузящих систему не наблюдается. выключаем (отсоединяем) принтер и получаем новый процесс captmon который грузит систему на 50%, подключаем (включаем) принтер - нормально печатает, отключаем принтер и получаем еще один новый процесс captmon....и так до бесконечности. поразвлекался я пол дня и понял, что чегото тут не так. вот только чего???


Я тоже пробовал аналогичную вещь на debian, но для LBP2900. Вообще не срабатывает при подключении принтера! И главное где посмотреть лог его работы? И куда копать? Может кто знает?
Спасибо сказали: