Рейтинг:2

Acpid не может выполнять скрипты

флаг cn

У меня есть старый ноутбук, и я установил версию Ubuntu 20.04 LTS Server (без графического интерфейса, только CLI). Он управляется через SSH, поэтому его отображение не требуется. Я хотел бы выключить дисплей, когда я закрою крышку, и снова включить, если я ее открою.

Я успешно настроил acpid для управления дисплеем.

В /etc/acpi/события Я создал файл:

событие=кнопка/крышка.*
action=/etc/acpi/lid.sh

Сценарий:

#!/бин/ш

grep -q закрыто /proc/acpi/button/lid/LID/state
если [$? = 0]
тогда
    # закрыть действие
    setterm --пустая сила
еще
    # открытое действие
    setterm --blank тыкать
фи

Если я запускаю этот скрипт вручную, он работает отлично, однако кажется, что acpi не может запустить скрипт:

$ sudo journalctl -u acpid -f

...
04 июля 20:03:01 сервер acpid [1179]: получено событие входного слоя «кнопка / крышка крышки закрыта»
04 июля 20:03:01 сервер acpid[1179]: правило из /etc/acpi/events/lid совпало
04 июля 20:03:01 сервер acpid[1353]: выполнение действия "/etc/acpi/lid.sh"
04 июля 20:03:01 сервер acpid[1179]: действие завершено со статусом 1
04 июля, 20:03:01 сервер acpid[1179]: всего совпало 1 правило
04 июля 20:03:01 сервер acpid [1179]: завершено событие входного слоя «кнопка / крышка крышки закрыта»
...

Ошибка: действие завершено со статусом 1 (не 0)

Если я правильно понимаю, код выхода 1 — это проблема с разрешением (операция не разрешена). Я не знаю, почему это «не разрешено», потому что мне не нужно использовать судо для запуска этого скрипта.

флаг hr
У вас есть ресурс, который говорит, что это должно быть возможно с помощью `setterm` из действия acpid? Насколько я понимаю, `setterm` нужно запускать внутри терминала. Интересно, является ли статус выхода 1 на самом деле `setterm`, сообщающим вам, что он не подключен к терминалу (или не распознает тип терминала), а не ошибкой EPERM?
Рейтинг:0
флаг cn

So finally I figured out what was the problem.

As steeldriver mentioned, setterm needs to be run inside a terminal (in front of the laptop), and in my script it wasn't connected to a real terminal and setterm could change nothing.

According to this post, we need to redirect the output or input to/from the console.

So I modified my script:

#!/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

I tested this script and it's work like a charm ;)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.