Запустите сервис после выхода пользователя

MyUnit2.service

[Unit]
Description = MyUnit2
[Service]
RemainAfterExit=true
ExecStart=/usr/mscript2
Type=oneshot
[Install]
WantedBy=shutdown.target reboot.target

mscript2

\> /var/log/mlog2.log
echo "Time:" >> /var/log/mlog2.log
date >> /var/log/mlog2.log
echo "Uptime:" >> /var/log/mlog2.log
uptime >> /var/log/mlog2.log

В соответствии с задачей необходимо, чтобы скрипт выполнялся после завершения работы, перезагрузки, выхода пользователя. Первые два варианта я сделал. Как мне закончить работу?

0
задан 13 July 2019 в 16:53

1 ответ

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

  1. использование gdm для запуска сценария (помещенный в/etc/gdm/PostSession) после выхода из системы. Больше на этом здесь .
  2. Использование два новых отдельных systemd сервисы. Второй должен быть запущен первым в то время, когда первый останавливается. Настройте первый сервис для остановки при пользовательском выходе из системы путем привязки его с уже существующим сервисом сеанса пользователя (user@.service).

я не знаком с деталями или достоинствами первого маршрута, таким образом, я только опишу второй маршрут.

В быстром тесте я вошел в систему как другой пользователь на другом tty и проверил, что мой процесс (простое echo сообщение) был успешно запущен/выполнен после выхода из системы (cmd logout) этого пользователя. Это хорошо работало в находящейся в debian системе с systemd v232.

Мой пример содержит три элемента:

  1. Изменяют существующий user@.service, чтобы заставить его запустить экземпляр сервиса (helperunit@.service), который связывает с user@.service. Таким образом, две вещи достигаются:
    • Вы получаете инстанцированные сервисы, которые могут легко быть связаны с пользователями (для входа, и т.д.)
    • , сервис помощника останавливается, когда пользователь выходит из системы
<час>
# /lib/systemd/system/user@.service

[Unit]
Description=User Manager for UID %i
After=systemd-user-sessions.service

[Service]
User=%i
PAMName=systemd-user
Type=notify
ExecStart=-/lib/systemd/systemd --user
Slice=user-%i.slice
KillMode=mixed
Delegate=yes
TasksMax=infinity
TimeoutStopSec=120s

# /etc/systemd/system/user@.service.d/afterlogout.conf
[Service]
Environment="USERUID=%i"
ExecStartPost=+/bin/systemctl start helperunit@${USERUID}.service
  1. , Создают helperunit сервисный файл (связанный с user@.service), который используется для запуска второго сервиса (afterlogout@.service) в то время, когда он останавливается (т.е. после пользовательского выхода из системы)
<час>
# /etc/systemd/system/helperunit@.service

[Unit]
Description=helper-to-start-afterlogout-service Service
BindsTo=user@%i.service

[Service]
Environment="USERUID=%i"
RemainAfterExit=yes
Type=oneshot
ExecStart=/bin/true
ExecStopPost=/bin/systemctl start afterlogout@${USERUID}.service

[Install]
  1. Создают второй сервисный файл единицы, который запускает скрипт после пользовательского выхода из системы
<час>
# /etc/systemd/system/afterlogout@.service

[Unit]
Description=trigger-script-after-user-logout Service
Before=reboot.target shutdown.target

[Service]
Environment="USERUID=%i"
Type=oneshot
ExecStart=/bin/echo "user UID=${USERUID} has logged out"

[Install]

способ, которым это настраивается, сервисные экземпляры будут иметь пользователя UID на их имя (например, afterlogout@1000.service)

1
ответ дан 23 October 2019 в 23:57

Другие вопросы по тегам:

Похожие вопросы: