Вопрос или проблема
Я новичок в Linux и буду рад любой помощи.
Я использую gdm и хочу выполнять скрипт **каждый раз**, когда пользователь входит в систему или выходит из нее.
Чтобы убедиться, что механизм работает, я сначала попробовал выполнить скрипт только при входе (а не при выходе).
Я пытался запустить службу, которая это делает, добавив службу в /etc/systemd/user/serv.service
.
Ниже приведена единица, которую я написал:
[Unit]
Description=service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/bash /home/user/Documents/scriptlogin
User=user
[Install]
WantedBy=default.target
Я включил службу с помощью systemctl --user start serv.service
,
и я вижу, что скрипт выполняется только при перезагрузке, но не при входе/выходе.
Я не уверен, что понимаю строку default.target
, но предполагаю, что уровень выполнения не изменяется, когда пользователь выходит из системы или входит в нее, поэтому скрипт не выполняется снова при выходе и повторном входе.
Кто-нибудь знает, как мне это исправить?
Спасибо заранее!
Ваш .service файл выглядит нормально.
Вам нужно включить его с помощью:
systemctl --user enable serv.service
(а не start
, который, вероятно, просто запускает его немедленно, один раз)
Кроме того, у меня файлы .service пользователя находятся скорее в:
/home/user/.config/systemd/user/
но ваше расположение тоже может быть нормальным…
WantedBy=default.target — это условие, которое запускает выполнение вашего скрипта. Я не уверен, является ли это, возможно, значением по умолчанию для служб пользователя. Вы можете запустить systemctl --user list-dependencies
, чтобы увидеть, что инициализируется до этого. И systemctl --user list-dependencies --reverse
, чтобы увидеть, что идет после (обычно ничего).
Ответ или решение
Для решения задачи по выполнению скрипта при каждом входе и выходе пользователя в системе на основе дисплейного менеджера GDM (GNOME Display Manager), необходимо правильно настроить службу systemd. Давайте рассмотрим поэтапно, как это сделать.
1. Создание скрипта
Сначала убедитесь, что ваш скрипт существует и корректно выполняется. В вашем случае это /home/user/Documents/scriptlogin
. Проверьте, что скрипт имеет права на выполнение:
chmod +x /home/user/Documents/scriptlogin
2. Создание юнит-файла
Ваш юнит-файл /etc/systemd/user/serv.service
имеет правильную структуру, но чтобы сработать при каждом входе и выходе пользователя, сделаем некоторые изменения.
Пример юнит-файла
Создайте или отредактируйте юнит-файл /etc/systemd/user/serv.service
:
[Unit]
Description=Execute Script on User Login/Logout
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/bash /home/user/Documents/scriptlogin
User=user
[Install]
WantedBy=default.target
3. Активация службы
Теперь включите службу, чтобы она запускалась при каждом входе в систему, и активируйте её:
systemctl --user enable serv.service
systemctl --user start serv.service
4. Запуск при выходе
Чтобы скрипт также выполнялся при выходе из системы, вам нужно создать отдельный сервис для логина и логаута или настроить один и тот же с использованием ExecStartPost
и ExecStop
.
Пример альтернативного юнит-файла
Если вы хотите более детальные действия, можно использовать ExecStop
для выполнения скрипта при выходе:
[Unit]
Description=Execute Script on User Login/Logout
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/bash /home/user/Documents/scriptlogin
ExecStop=/bin/bash /home/user/Documents/scriptlogout
User=user
[Install]
WantedBy=default.target
5. Проверка статуса
Для проверки, что ваша служба работает правильно, используйте следующие команды:
systemctl --user status serv.service
6. Убедитесь в правильной настройке окружения
Убедитесь, что вы запускаете все команды от имени вашего пользователя. Если у вас параллельно идут другие сессии (например, SSH), убедитесь, что вы находитесь в сессии, на которую влияет ваш юнит-файл. Возможно, вам потребуется войти в GUI-десктоп или обновить системные настройки GDM.
Заключение
С помощью этих настроек скрипты будут выполняться при каждом входе и выходе пользователя. Если у вас возникнут дополнительные вопросы или сложности, рассмотрите возможность изучения документации по systemd или использования форумов, где обсуждаются аналогичные проблемы. Удачи в ваших начинаниях с Linux!