У меня есть старый ноутбук, и я установил Ubuntu 20.04 LTS Server edition (без графического интерфейса, только интерфейс командной строки). Он управляется через SSH, поэтому его отображение не требуется. Я бы хотел выключить дисплей, когда закрываю крышку, и снова включать, если я ее открою.
Я успешно настроил acpid для управления дисплеем.
В / etc / acpi / events я создал файл:
event=button/lid.*
action=/etc/acpi/lid.sh
Скрипт:
#!/bin/sh
grep -q closed /proc/acpi/button/lid/LID/state
if [ $? = 0 ]
then
# close action
setterm --blank force
else
# open action
setterm --blank poke
fi
Если я запускаю этот скрипт вручную, он работает отлично, однако кажется, что acpi не может работать сценарий:
$ sudo journalctl -u acpid -f
...
Jul 04 20:03:01 server acpid[1179]: received input layer event "button/lid LID close"
Jul 04 20:03:01 server acpid[1179]: rule from /etc/acpi/events/lid matched
Jul 04 20:03:01 server acpid[1353]: executing action "/etc/acpi/lid.sh"
Jul 04 20:03:01 server acpid[1179]: action exited with status 1
Jul 04 20:03:01 server acpid[1179]: 1 total rule matched
Jul 04 20:03:01 server acpid[1179]: completed input layer event "button/lid LID close"
...
Ошибка: действие завершено со статусом 1 (не 0)
Если я правильно знаю, код выхода 1 является проблемой разрешения (операция не разрешена). Я не знаю, почему это «запрещено», потому что мне не нужно использовать sudo
для запуска этого скрипта.
Итак, наконец, я понял, в чем проблема.
Как упоминал Steeldriver, setterm
необходимо запускать внутри терминала (перед ноутбуком), а в моем скрипте он не был подключен к реальному терминалу и setterm
ничего не мог изменить.
Согласно в этом сообщении, нам нужно перенаправить вывод или ввод на / с консоли.
Итак, я изменил свой скрипт:
#!/bin/sh
grep -q closed /proc/acpi/button/lid/LID/state
if [ $? = 0 ]
then
# close action
setterm -term linux --blank force </dev/tty1
else
# open action
setterm -term linux --blank poke </dev/tty1
fi
Я протестировал этот скрипт, и он отлично работает;)