1. Загрузка служб.
Пользуете ли вы принтер?
Если да, то наверно через CUPS, и скорее всего, он запускается при загрузке системы.
Вопрос. А так ли вы часто печатаете, что CUPS находится в автозагрузке?
Очевидно, если CUPS будет запускатся только при включении принтера, и останавливаться при выключении, то это будет хорошо.
Следующий набросок сделан на примере Gentoo, но скорее всего он подойдёт и к другим дистрибутивам с некоторым адаптированием.
И так, надеюсь вам известно, какое устройство в /dev представляет ваш принтер.
узнаем о нём немного больше.
Смотрим путь в sysfs:
Код: Выделить всё
# udevinfo -q path -n /dev/usb/lp0
/devices/pci0000:00/0000:00:10.1/usb6/6-2/6-2:1.0/lp0
Затем его "особенности"
Код: Выделить всё
# udevinfo -a -p /devices/pci0000:00/0000:00:10.1/usb6/6-2/6-2:1.0/lp0
---SKIP---
looking at device '/class/usb/lp0':
KERNEL=="lp0" <==== Вот, что надо.
SUBSYSTEM=="usb"
SYSFS{dev}=="180:0"
---SKIP---
Там много чего выодится, но нам нужно, только то, как его обзывает ядро.
Дальше создаем правила udev:
Код: Выделить всё
/etc/udev/rules.d/99-udev-my.rules
# Printer
KERNEL=="lp0", ACTION=="add", RUN+="/etc/udev/scripts/printer add"
KERNEL=="lp0", ACTION=="remove", RUN+="/etc/udev/scripts/printer remove"
И скрипт к нему
Код: Выделить всё
/etc/udev/scripts/printer
#!/bin/bash
LOG="/var/log/udev"
sleep 3
if [ "$1" = "add" ]; then
echo "--- `date` ---" >> $LOG
echo "starting printing system" >> $LOG
/etc/init.d/cupsd start >> $LOG 2>&1
elif [ "$1" = "remove" ]; then
echo "--- `date` ---" >> $LOG
echo "stopping printing system" >> $LOG
/etc/init.d/cupsd stop >> $LOG 2>&1
fi
Надо пояснить, что
Задержка в 3 или более секунд необходима для того, чтобы ядро успело выполнить свои действия по инициализации устройства.
Есть в этом деле одно но, если принтер включен до загрузки Linux, то из-за того, что udev инициализируется гораздо раньше запуска требуемых служб, наш сервис остается не запущенным.
Дабы избежать этого, можно в ваш дополнительный локальный скрипт инициализации (в Gentoo это уже присутствующий /etc/init.d/local, с файлами конфигурации /etc/conf.d/local.*, в других дистрибутивах вы можете создать свой) добавить следующее:
Код: Выделить всё
checkprinter() {
PRINTERDEV=/dev/usb/lp0
if [ -e $PRINTERDEV ]; then
/etc/init.d/cupsd start
fi
}
checkprinter
(В моем случае я это добавил в /etc/conf.d/local.start согласно рекомендациям моего дистрибутива)
Вот и всё
-----------------------------------------------------------
Литература.
Tips от Madskull'a
http://ru.gentoo-wiki.com/HOWTO_Udev_и_авт...вание_носителей
man udev