apmd - демон мониторинга расширенного управления питанием (Advanced Power Management)
Демон apmd следит за наступлением заданных событий подсистемы расширенного управления питанием (Advanced Power Management - APM) и, при наступлении одного из этих событий, выполняет соответствующую последовательность команд. Демон apmd обрабатывает только события, указанные в файле конфигурации; все остальные события игнорируются. Для каждого события, о котором уведомляет подсистема APM BIOS, демон apmd вызывает заданную в конфигурационном файле последовательность команд. Когда демон apmd контролирует запросы остановки/режима ожидания (suspend/standby requests), ядро эти запросы обрабатывать не будет. Поэтому, если необходимо выполнять действие при наступлении этих событий, надо явно задать соответствующие команды или вызовы встроенных функций в конфигурационном файле.
Демон apmd распознает следующие опции:
| -d | Запуск в режиме отладки. В результате, демон apmd запускается в приоритетном режиме, а не в фоновом. |
| -f файл | Задает другой конфигурационный файл, файл , для использования вместо стандартного, /etc/apmd.conf . |
| -v | Многословный режим работы. |
При запуске демон apmd читает конфигурационый файл (по умолчанию - /etc/apmd.conf ) и передает набор событий, которые надо контролировать, драйверу устройства APM. При завершении работы демона драйвер устройства APM автоматически прекращает контроль событий.
Если процесс apmd получает сигнал SIGHUP , он перечитывает свой конфигурационный файл и уведомляет драйвер устройства APM о любых изменениях в конфигурации.
Демон apmd использует устройство /dev/apmctl для выполнения запросов ioctl(2) для контроля событий и управления подсистемой APM. Этот специальный файл устройства открывается в режиме исключительного доступа, поэтому в каждый момент времени может работать только один процесс apmd .
Когда демон apmd получает уведомление о событии от подсистемы APM, он запускает порожденный процесс для выполнения команд, указанных в конфигурационном файле, а затем продолжает работу в ожидании других событий. Порожденный процесс выполняет команды последовательно, в указанном порядке.
Пока демон apmd обрабатывает список команд для запросов SUSPEND / STANDBY , драйвер устройства APM ядра выдает уведомления подсистеме APM BIOS раз в секунду, так что BIOS знает, что есть еще не выполненные команды, и что запрос еще нельзя считать обработанным.
Демон apmd создает файл /var/run/apmd.pid , в котором записывает свой идентификатор процесса. Этот идентификатор можно использовать для остановки или переконфигурирования процесса apmd .
Структура конфигурационного файла демона apmd весьма проста. Например, конструкция:
apm_event SUSPENDREQ {
exec "sync &&
sync &&
sync"; exec "sleep
1"; exec "zzz";
}
вызовет получение демоном apmd события APM " SUSPENDREQ " (которое может инициироваться закрытием ноутбука), при обработке которого трижды выполняется команда " sync ", затем демон ожидает 1 секунду и выполняет команду zzz ( apm-z ) для перевода системы в состояние останова.
Итак, конфигурационный файл содержит одну или более подобных конструкций со следующими компонентами:
Ключевое слово apm_event apm_event - это ключевое слово, свидетельствующее о начале конструкции, задающей обработку событий.| STANDBYREQ | |
| USERSTANDBYREQ | |
| SUSPENDREQ | в списке команд должна быть sync |
| USERSUSPENDREQ | в списке команд должна быть sync |
| BATTERYLOW | в списке команд должна быть только zzz |
| NORMRESUME |
| CRITRESUME |
| STANDBYRESUME |
| POWERSTATECHANGE |
| UPDATETIME |
| CAPABILITIESCHANGE |
Типичные команды в конфигурационном файле:
apm_event SUSPENDREQ {
exec "/etc/rc.suspend";
}
apm_event USERSUSPENDREQ {
exec "sync && sync && sync";
exec "sleep 1";
exec "apm -z ";
}
apm_event NORMRESUME, STANDBYRESUME {
exec "/etc/rc.resume";
}
# Обработка события resume для мыши на последовательном порту:
# переинициализация демона moused(8), подключенного к этому порту.
#
#apm_event NORMRESUME {
# exec "kill -HUP `cat /var/run/moused.pid`";
#}
#
# Обработка события suspend для пользователей жестких дисков ATA:
# выполняем standby вместо suspend .
# #apm_event SUSPENDREQ {
# reject;
# exec "sync && sync && sync";
# exec "sleep 1";
# exec "apm -Z";
#}
Мицуру Ивасаки (Mitsuru IWASAKI) ( iwasaki@FreeBSD.org),
Коё Хидетака (KOIE Hidetaka) ( koie@suri.co.jp)
Определенный вклад внесли также:
Уорнер Лош (Warner Losh) ( imp@FreeBSD.org),
Хироши Ямашита (Hiroshi Yamashita) ( bluemoon@msj.biglobe.ne.jp),
Ёшихико Сарумару (Yoshihiko SARUMARU) ( mistral@imasy.or.jp),
Норихиро Кумагаи (Norihiro Kumagai) ( kuma@nk.rim.or.jp),
Накагава Ёшихиша (NAKAGAWA Yoshihisa) ( nakagawa@jp.FreeBSD.org)
и
Ник Хильярд (Nick Hilliard) ( nick@foobar.org).
Демон apmd появился в FreeBSD 3.3.
FreeBSD 4.6, 28 июня 1999 года