LINUX.ORG.RU

[fedora 15]Событие acpi при открытии крышки нетбука


0

1

Всем привет! После выхода из ждущего режима требуется запускать некоторый бинарный файл (для того, чтобы заработала клавиатура - см. описание проблемы, здесь предложено решение, которое у меня не получается адаптировать для Fedora).

Я создал два файла:

/etc/acpi/events/keyw:

event=button/lid/ LID open
action=/etc/acpi/actions/keyw.sh

/etc/acpi/actions/keyw.sh:

#!/bin/bash
cd /usr/bin
./keyw
Но ничего не работает; вместо «open» в /etc/acpi/events/keyw пробовал и «00000080» и «00000080.*», но это не помогает.

Запускаю acpi_listen - всё в порядке - после закрывания (открывания) крышки вижу /button/lid LID close(open) соответственно.

Пакеты acpid и acpi-tools установлены (в качестве утилиты управления питанием использую xfce4-power-manager), права на скрипт keyw.sh -rwxr-xr-x. Использую Fedora RFR 15 LXDE-сборку.

Может быть запускать бинарный файл описанным образом не совсем правильно и нужно как-то запускать соответствующую службу? И ещё вопрос: можно ли что-то подобное сделать при выходе из спящего режима (гибернации)?


Обычно используют один сценарий, который обрабатывает все события. Вот пример из /usr/share/doc/acpid/samples/

handler.sh:

event=*
action=acpi_handler.sh "%e"
т.е. любое событие обрабатывается сценарием acpi_handler.sh:
#!/bin/sh

if [ $# != 1 ]; then
	exit 1
fi
set $*

case "$1" in
  button)
    case "$2" in
      power) /sbin/init 0
      ;;
      *) logger "ACPI action $2 is not defined"
      ;;
    esac
    ;;

  *) logger "ACPI group $1 is not defined"
  ;;
esac

trancefer ★★ ()
Ответ на: комментарий от trancefer

Обычно используют один сценарий, который обрабатывает все события.

Хм, странно. Насколько я понял справочную страницу acpid, там призывают использовать отдельные файлы для отдельных событий:

man acpid

...
Create a file named /etc/acpi/events/power that contains the following:

              event=button/power
              action=/etc/acpi/power.sh "%e"

Then create a file named /etc/acpi/power.sh that contains the following:

              /sbin/shutdown -h now "Power button pressed"

Now, when acpid is running, a press of the power button will cause  the rule in /etc/acpi/events/power to trigger the script in /etc/acpi/power.sh. The script will then shut down the system.
...

Можно узнать какой у Вас дистрибутив и версия acpid (у меня 2.0.9)?

Я попытался воспользоваться Вашим советом, создал файлы /etc/acpi/events/wkup и /etc/acpi/actions/wkup.sh с содержимым:

event=*
action=wkup.sh "%e"

и

#!/bin/sh

if [ $# != 1 ]; then
	exit 1
fi
set $*

case "$1" in
  button)
    case "$2" in
      lid)
	case "$3" in
	  open) /usr/bin/pcmanfm #проверка работоспособности
	    ;;
      	    *) logger "ACPI action $3 is not defined"
      	    ;;
	    esac
      ;;
      *) logger "ACPI action $2 is not defined"
      ;;
    esac
    ;;
    *) logger "ACPI group $1 is not defined"
    ;;

соответственно, но всё равно ничего не работает.

При этом в /var/log/messages никакие сообщения от демона acpid не приходят до тех пор, пока не будет запущена команда acpi_listen, при этом выводится следующее:

acpid: client connected from 1806[500:500]
acpid: 1 client rule loaded
#прерываем acpi_listen
acpid: client 1806[500:500] has disconnected

Может быть в Fedora используется какой-то другой способ обработки событий acpi? Или мне нужно импользовать другое решение?

bor-e ()

Я такой скрипт при закрытии крышки использую:

/etc/acppi/events/lid

event=button[ /]lid
action=/etc/acpi/lid.sh

/etc/acpi/lid.sh

#!/bin/bash

. /etc/acpi/functions.sh

getEnviron;

grep -q closed /proc/acpi/button/lid/*/state
if [ $? = 0 ]
then
	xset -display $DISPLAY dpms force off
	/etc/acpi/lockbtn.sh
fi

kernelpanic ★★★★★ ()
Ответ на: комментарий от bor-e

Во-первых, укажите полный путь к сценарию:

event=*
action=/etc/acpi/actions/wkup.sh "%e"

Во-вторых лучше сначала использовать echo для точной идентификации событий:

#!/bin/sh

if [ $# != 1 ]; then
	exit 1
fi
set $*

case "$1" in
  *) echo "ACPI event: $1" >> /tmp/acpid.log
  ;;
esac

В-третьих, у меня Arch и acpid-2.0.10; до этого был Gentoo и все так же работало.

trancefer ★★ ()
Ответ на: комментарий от bor-e

Вот сценарий который используется на Thinkpad, в качестве примера:

#!/bin/dash

# ACPI events handler

set $*

device=${2}
value=${4}

# Unknown events will be logged
unhandled() {
  logger -p local7.notice "ACPI event unhandled: $*"
}

case "$device" in

  HKEY)
    case "$value" in
      0000?002)
        # Lock screen (Fn + F2)
        /etc/acpi/scripts/screen-lock.sh
      ;;
      0000?003)
        # Manual power switch (Fn + F3)
        # /etc/acpi/scripts/power-switch.sh
        /etc/acpi/scripts/min-power.sh
      ;;
      0000?004)
        # Suspend to RAM (Fn + F4)
        /etc/acpi/scripts/suspend-to-ram.sh
      ;;
      0000?005)
        # Enable/disable bluetooth (Fn + F5)
        /etc/acpi/scripts/bluetooth-switch.sh
      ;;
      0000?007)
        # Switch video output (Fn + F7)
        /etc/acpi/scripts/video-output-switch.sh
      ;;
      0000?009)
        # Connect dock-station (Fn + F9)
        /etc/acpi/scripts/dock-station-switch.sh
      ;;
      0000?00c)
        # Suspend to disk (Fn + F12)
        /etc/acpi/scripts/suspend-to-disk.sh
      ;;
      *)
        unhandled $*
      ;;
    esac
  ;;

  PWRF)
    case "$value" in
      00000001)
        # Power button
        /etc/acpi/scripts/shutdown.sh
      ;;
      *)
        unhandled $*
      ;;
    esac
  ;;

  LID)
    case "$value" in
      0000000a)
        # Lid close
        # /etc/acpi/scripts/lid-close.sh
      ;;
      0000000b)
        # Lid open
        # /etc/acpi/lid-open.sh
      ;;
      *)
        unhandled $*
      ;;
    esac
  ;;

  AC)
    case "$value" in
      00000000)
        # AC off
        # logger "acpid: AC adapter is plugging off;"
        /etc/acpi/scripts/ac-disable.sh
      ;;
      00000001)
        # AC on
        # logger "acpid: AC adapter is plugging on;"
        /etc/acpi/scripts/ac-enable.sh
      ;;
      *)
        unhandled $*
      ;;
    esac
  ;;

  *)
    unhandled $*
  ;;

esac

trancefer ★★ ()
Ответ на: комментарий от trancefer

укажите полный путь к сценарию

Делал, не помогает. Судя по всему, какой-то глюк с acpid: в файле /etc/acpi/actions/wkup.sh прописал следующее:

#!/bin/sh

if [ $# != 1 ]; then
	exit 1
fi

set $*

case "$1" in
  *) echo "ACPI event: $1" >> /tmp/acpid.log
  ;;
esac

Потом создал файл /tmp/acpid.log и сделал

tail -f /tmp/acpid.log
Открываю-закрываю крышку - acpi_listen отслеживает событие, а в журнале (/tmp/acpid.log) ничего нет. Странно.

bor-e ()

Всем спасибо за советы, решено следующим способом:

Нужный бинарный файл запускается не через обработчик событий acpi - acpid, а с помощью pm-utils.

Создал файл /usr/lib/pm-utils/sleep.d/57keyboardrun.sh с содержимым:

#!/bin/sh
case $1 in
    thaw|resume)
	./usr/bin/key
    ;;
    *)  echo "ERROR: used incorrectly."
    ;;
esac

И - вуаля! - после выхода из ждущего режима/гибернации клавиатура работает!

Решение найдено здесь.

bor-e ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.