- Вопрос или проблема
- Ответ или решение
- Как запустить экранный замок в сеансе пользователя с помощью системного сервиса systemd
- Шаг 1: Подготовка скрипта для запуска экранного замка
- Шаг 2: Создание системного сервиса systemd
- Шаг 3: Активировать и протестировать сервис
- Шаг 4: Использование переменных окружения для пользовательских настроек
- Шаг 5: Рассмотрение возможности создания юзер-сервиса systemd
- Заключение
Вопрос или проблема
Я видел этот вопрос, но сложность ответа заставляет меня сомневаться, на правильном ли я пути.
Я хочу настроить Ubuntu так, чтобы экран блокировался при приостановлении работы. Я также хочу сделать это правильно, даже если мой фактический случай использования этого не требует, ради получения опыта.
Что я хочу достичь:
- Системная настройка для запуска блокировщика экрана для любого пользователя, вошедшего в систему на компьютере, при закрытой крышке
- Каждый пользователь может использовать переменные окружения для указания директории с изображениями, которые будут использоваться блокировщиком экрана.
Что у меня есть на данный момент:
- скрипт в
/usr/local/bin
для запуска блокировки экрана. Это используетxsecurelock
- установлен
xsecurelock
- сервис в
/etc/systemd/system
, который вызывает скрипт с помощьюExecStart
Моя проблема заключается в том, чтобы позволить systemd запустить скрипт запуска в текущей активной сессии.
Я мог бы получить активную сессию с помощью этого:
for session_id in $(loginctl list-sessions --no-legend | awk '{ print $1 }') ; do
state=$(loginctl show-session -p State --value $session_id)
if [[ "$state" == "active" ]] ; then
active_session_id=$session_id
active_user=$(loginctl show-session -p User --value $session_id)
fi
done
, но я не знаю, как вызвать скрипт в этой существующей сессии.
Мне кажется, что может быть более простой способ сделать это. Должен ли я создать сервис пользователя systemd? В этом случае, как я могу убедиться, что у всех пользователей есть такой сервис?
Ответ или решение
Как запустить экранный замок в сеансе пользователя с помощью системного сервиса systemd
Для настройки автоматического запуска экранного замка при переходе системы в спящий режим с использованием systemd
, вам необходимо учесть несколько ключевых аспектов. Ваша цель заключается в том, чтобы обеспечить, чтобы любой пользователь, который вошел в систему, получал экранный замок при закрытии крышки. Давайте проанализируем, как это можно реализовать на Ubuntu.
Шаг 1: Подготовка скрипта для запуска экранного замка
Вы уже упомянули наличие скрипта в /usr/local/bin
, который запускает xsecurelock
. Убедитесь, что ваш скрипт корректно работает независимо от того, откуда он вызывается. Пример простого скрипта:
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/<имя_пользователя>/.Xauthority
exec xsecurelock
Замените <имя_пользователя>
на имя пользователя, чей сеанс вы хотите управлять. Этот скрипт должен иметь права на выполнение:
sudo chmod +x /usr/local/bin/your-lock-script.sh
Шаг 2: Создание системного сервиса systemd
Теперь создайте системный сервис в /etc/systemd/system
, например, screenlocker.service
:
[Unit]
Description=Screen Locker on Suspend
After=suspend.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/your-lock-script.sh
User=<имя_пользователя>
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/<имя_пользователя>/.Xauthority
[Install]
WantedBy=suspend.target
Не забудьте заменить <имя_пользователя>
на актуальное имя пользователя.
Шаг 3: Активировать и протестировать сервис
После создания сервиса активируйте его:
sudo systemctl enable screenlocker.service
Теперь протестируйте его, сработает ли замок, когда вы переводите систему в спящий режим:
sudo systemctl suspend
Шаг 4: Использование переменных окружения для пользовательских настроек
Чтобы каждый пользователь мог настраивать свою переменную окружения, вы можете добавить в скрипт проверки на наличие настроек в домашней директории пользователя. Например:
#!/bin/bash
USER_IMAGES_DIR="${HOME}/.screenlocker/images"
if [ -d "$USER_IMAGES_DIR" ]; then
export SCREENLOCK_IMAGES="$USER_IMAGES_DIR"
fi
export DISPLAY=:0
export XAUTHORITY=${HOME}/.Xauthority
exec xsecurelock
Шаг 5: Рассмотрение возможности создания юзер-сервиса systemd
Как альтернатива, вы можете создать юзер-сервис systemd
, чтобы управлять экранным замком для каждого пользователя индивидуально. Это позволит каждому пользователю иметь свою настройку, и сервис будет работать только в контексте його сессии. Однако это потребует, чтобы каждый пользователь сам создавал и активировал свой сервис.
Пример для создания юзер-сервиса:
- Перейдите в директорию юзер-сервисов:
mkdir -p ~/.config/systemd/user
- Создайте файл в этой директории, например,
screenlocker.service
:
[Unit]
Description=Screen Locker on Suspend
After=suspend.target
[Service]
ExecStart=/usr/local/bin/your-lock-script.sh
[Install]
WantedBy=suspend.target
- Затем активируйте сервис для текущего пользователя:
systemctl --user enable screenlocker.service
Заключение
Настройка автоматического запуска экранного замка при переходе в спящий режим — это полезное и практическое решение для повышения безопасности вашей системы. Ваша реализация может варьироваться от системного сервиса, обслуживающего всех пользователей, до индивидуального юзер-сервиса, который дает каждому пользователю гибкость в настройках. Какой бы путь вы ни выбрали, данная настройка значительно улучшит вашу работу с системой Ubuntu.