Страница 1 из 1
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 24 авг 2022, 06:51
nok128
Нужно запустить скрипт после выхода из ждущего режима. Прочитал, что это можно сделать с помощью systemd, который до и после ждущего режима автоматически выполнит все находящиеся в
/usr/lib/systemd/system-sleep
скрипты. Для тестирования данной возможности добавил в
/usr/lib/systemd/system-sleep
файл
myscript.sh
следующего содержания:
Добавил файлу право исполняемости.
Но уведомление не выводится ни до входа в ждущий режим, ни после выхода из него. При этом если запустить его напрямую (
./myscript.sh
), уведомление выводится.
В чём может быть причина?
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 24 авг 2022, 07:23
rogoznik
nok128 писал(а): ↑24 авг 2022, 06:51
В чём может быть причина?
В том что в этом случае скрипты выполняются от суперпользователя, а у него к пользовательской X-сессии доступа нет
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 24 авг 2022, 08:42
nok128
rogoznik писал(а): ↑24 авг 2022, 07:23
в этом случае скрипты выполняются от суперпользователя
А есть ли в таком случае возможность запустить команду внутри такого скрипта от имени пользователя? Я пробовал
sudo -u <username> notify-send "test"
, но это не сработало.
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 24 авг 2022, 09:08
Sova
nok128 писал(а): ↑24 авг 2022, 06:51
В чём может быть причина?
Причина в том, что эти скрипты должны быть написаны определенным образом - зависит от того, должна ли выполняться команда (или команды) до входа в ждущий, после или в обоих случаях. Плюс, notify-send через Системду работаетет как-то иначе, чем просто из консоли. Попробуйте вот такой скрипт для проверки:
Код: Выделить всё
#!/bin/sh
case $1/$2 in
pre/*)
notify-send "Перед ждущим"
;;
post/*)
notify-send "После ждущего"
;;
esac
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 24 авг 2022, 11:39
slant
nok128 писал(а): ↑24 авг 2022, 08:42
А есть ли в таком случае возможность запустить команду внутри такого скрипта от имени пользователя? Я пробовал sudo -u <username> notify-send "test", но это не сработало.
И не должно.
Чтобы достучаться до чужих иксов, а для root иксы запущенные пользователем - чужие, и попытки изменить самого активного пользователя через sudo здесь никак не помогут, т.к. это будет НОВАЯ сессия другого пользователя, а не та где идет вывод на экран, нужно обращаться к dbus. В частности - есть dbus-launch. Там надо будет указать, к какой сессии цеплять запущенную программу.
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 25 авг 2022, 01:29
nok128
Sova писал(а): ↑24 авг 2022, 09:08
Причина в том, что эти скрипты должны быть написаны определенным образом
Не соглашусь. Для примера скрипт следующего содержания:
Код: Выделить всё
#!/bin/bash
echo 'hello, world!' > ~/hello.txt
После выхода из ждущего режима в каталоге
/root
обнаруживается файл
hello.txt
с содержимым
hello, world!
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 25 авг 2022, 01:30
nok128
Sova писал(а): ↑24 авг 2022, 09:08
Причина в том, что эти скрипты должны быть написаны определенным образом
Не соглашусь. Для примера скрипт следующего содержания:
Код: Выделить всё
#!/bin/bash
echo 'hello, world!' > ~/hello.txt
После выхода из ждущего режима в каталоге
/root
обнаруживается файл
hello.txt
с содержимым
hello, world!
.
Тот вариант, что Вы предложили, ожидаемо не сработал.
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 25 авг 2022, 01:31
nok128
slant писал(а): ↑24 авг 2022, 11:39
Чтобы достучаться до чужих иксов, а для root иксы запущенные пользователем - чужие, и попытки изменить самого активного пользователя через sudo здесь никак не помогут, т.к. это будет НОВАЯ сессия другого пользователя, а не та где идет вывод на экран, нужно обращаться к dbus. В частности - есть dbus-launch. Там надо будет указать, к какой сессии цеплять запущенную программу.
Понял. Благодарю!
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 25 авг 2022, 06:59
yarichin
nok128 писал(а): ↑25 авг 2022, 01:30
echo 'hello, world!' > ~/hello.txt
А если так ?
echo 'hello, world!' > /home/$USER/hello.txt
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 25 авг 2022, 07:52
rogoznik
yarichin писал(а): ↑25 авг 2022, 06:59
А если так ?
Не сработает. Т.к.
$USER
вернет
root
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 25 авг 2022, 12:24
slant
rogoznik писал(а): ↑25 авг 2022, 07:52
Не сработает. Т.к. $USER вернет root
..либо вообще ничего, т.к. это переменная
пользовательского окружения (интерактивного сеанса), а при вызове из под systemd далеко не обязательно эти переменные устанавливаются. Тут проверять надо, т.к. это в разных дистрибутивах по разному сделано.
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 25 авг 2022, 12:32
rogoznik
slant, думал об этом, но не стал озвучивать, т.к. уже достаточно того, что вернет не то что ожидалось автором сообщения
Скрипт в /usr/lib/systemd/system-sleep не выполняется автоматически
Добавлено: 31 авг 2022, 01:57
nok128
yarichin писал(а): ↑25 авг 2022, 06:59
А если так ?
echo 'hello, world!' > /home/$USER/hello.txt
Так проблема не в том, как записать файл в домашнюю директорию пользователя. Это как раз сделать не проблема. Запуск такого скрипта я продемонстрировал, чтобы доказать, что для запуска какого-либо скрипта из каталога
/user/lib/systemd/system-sleep/
не требуется, чтобы скрипт был написан по какому-то установленному шаблону, как написали выше:
Sova писал(а): ↑24 авг 2022, 09:08
Причина в том, что эти скрипты должны быть написаны определенным образом