Действительно, всё перечисленное ниже можно сделать с помощью acpid. И да, так было бы гораздо лучше. Но мне хотелось размять буйну голову, да соорудить миленький велосипедик. Зато свой. И еще одно уточнение — на моём системном блоке есть только кнопка Power.
Итак, написана была маленькая программка на C, которая делает только одну вещь: выполняет команду при нажатии кнопки Power на системном блоке.
В Unix всё — файл, а поэтому можно читать сообщения с «файлов» устройств. Что и было использовано. Необходимо только определить: какой файл в папке /dev относится к кнопке выключения. Можно даже сузить поиски: какой файл из event в папке /dev/input. Я лично просто перебрал всё что было в этой директории по очереди командой:
$ cat /dev/input/event0
При нажатии кнопки Power должен появляться мусор в консоли (и только тогда). Теперь можно и написать программку:
#include
Компилируется она просто (если эти строки скопировать в файл с именем button.c):
$ gcc button.c -o powerbuttond
Затем необходимо переместить программку в какую-нибудь root'овскую папку с бинарниками:
# mv powerbuttond /usr/sbin/
Окончательно протестировать работу можно вот так:
# powerbuttond /dev/input/event1 "ls -a -l"
Если всё работает, то осталось только написать скрипт для systemd или SysVinit (мой случай):
case ${1} in
start)
powerbuttond /dev/input/event1 "/sbin/halt" &
;;
stop)
killall powerbuttond
;;
*)
echo "Usage: ${0} {start|stop}"
exit 1
;;
esac
exit 0
Заменив /sbin/halt на команду отключения, которая вам по душе.