Как немедленно применять задержку

Вопрос или проблема

Согласно этому ответу, я включил длительное использование для пользователя на безголовой системе. Однако в loginctl list-sessions пользователь еще не указан. Если я вхожу в систему с этим пользователем через ssh, он отображается, но после отключения он исчезает.

Как я могу создать длительную сессию, не перезагружая всю систему?

Я безуспешно пытался выполнить systemctl restart systemd-logind.

Редактирование: Моя цель — запустить таймер, управляемый этим пользователем. Если я пытаюсь сделать это из оболочки sudo -iu после включения длительного использования, я получаю следующую ошибку:

$ systemctl --user status servicename
Не удалось подключиться к шине: Нет такого файла или каталога

Если я вхожу через ssh (и сессия появляется в loginctl), это работает как ожидалось. Но теперь я заметил, что это работает только в ssh-оболочке, а все еще не в оболочке sudo. Таким образом, это, вероятно, не связано с сессией.

Вы здесь путаете “пользователей” с “сессиями”.

Использование loginctl enable-linger myuser заставит менеджер пользователя для пользователя myuser запускаться при загрузке (и запускаться немедленно, если он еще не запущен), но на самом деле не запустит никаких сессий для пользователя (они начинаются только когда пользователь входит в систему).

Если вы используете команду loginctl list-users, вы увидите ее эффекты. Вы также можете использовать ps -fu myuser, чтобы увидеть работающий менеджер пользователя (systemd --user) для вашего пользователя, как только вы включаете длительное использование:

[root@myhost ~]# loginctl list-users
UID USER
  0 root

1 пользователь в списке.
[root@myhost ~]# ps -fu myuser
UID        PID  PPID  C STIME TTY          TIME CMD
[root@myhost ~]# loginctl enable-linger myuser
[root@myhost ~]# ps -fu myuser
UID        PID  PPID  C STIME TTY          TIME CMD
myuser   12345     1 20 18:44 ?        00:00:00 /usr/lib/systemd/systemd --user
myuser   12349 12345  0 18:44 ?        00:00:00 (sd-pam)
[root@myhost ~]# loginctl list-users
 UID USER      
   0 root      
1001 myuser

2 пользователя в списке.

Но новых сессий для myuser нет, так как он не вошел в систему через консоль, GUI или SSH:

[root@myhost ~]# loginctl list-sessions
SESSION UID USER SEAT TTY  
      1   0 root      tty0

1 сессия в списке.

Но независимо от сессий менеджер пользователя запущен, поэтому если у вашего пользователя есть юнит-пользователь (такие как сервисы или таймеры), они будут запущены при загрузке, независимо от того, вошел ли пользователь в систему или создал сессию.

Я надеюсь, что это объясняет ситуацию.


ОБНОВЛЕНИЕ: Из вашего редактирования вопроса похоже, что настоящая проблема заключается в выполнении команд systemctl --user из оболочки sudo -i, а не из сессии SSH.

Вы можете обойти это, экспортировав XDG_RUNTIME_DIR после переключения на пользователя, например:

$ export XDG_RUNTIME_DIR=/run/user/$UID

Или:

$ XDG_RUNTIME_DIR=/run/user/$UID systemctl --user status servicename

Причина, по которой вам это не нужно при входе через SSH, заключается в том, что SSH будет аутентифицировать вас с помощью PAM, и один из модулей PAM установит эти переменные среды для вас. Если вы используете sudo, вы не проходите через PAM (по крайней мере не через весь стек PAM), поэтому эти переменные среды не будут установлены должным образом.

Ответ или решение

Чтобы применить linger (долговременный сеанс) для пользователя в системе без перезагрузки, выполните следующие шаги:

1. Включение Linger

Прежде всего, убедитесь, что linger для вашего пользователя включен. Это можно сделать с помощью следующей команды:

loginctl enable-linger имя_пользователя

После выполнения этой команды служба управления пользователями (systemd --user) для указанного пользователя будет запущена сразу же, даже если пользователь не вошел в систему. Для проверки состояния выполните:

ps -fu имя_пользователя

Если linger включен, вы увидите, что пользовательский менеджер запущен.

2. Проверка текущих сеансов

Для проверки текущих сеансов выполните команду:

loginctl list-sessions

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

3. Вопрос о выполнении команд systemctl --user

Как вы отметили, когда вы используете команду sudo -iu, вы сталкиваетесь с ошибкой:

Failed to connect to bus: No such file or directory

Это происходит потому, что при использовании sudo вы не проходите через полную стековую аутентификацию PAM (Pluggable Authentication Modules), где устанавливаются необходимые переменные окружения, такие как XDG_RUNTIME_DIR.

4. Установка переменной окружения

Чтобы обойти эту проблему, вы можете явно установить переменную окружения XDG_RUNTIME_DIR, используя одну из следующих команд:

export XDG_RUNTIME_DIR=/run/user/$UID

или

XDG_RUNTIME_DIR=/run/user/$UID systemctl --user status имя_сервиса

Это позволит вам выполнять команды systemctl --user от имени пользователя, даже если вы находитесь в сеансе sudo.

5. Проверка статуса и управление таймерами

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

systemctl --user list-timers

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

Заключение и рекомендации

Включение linger для пользователей в headless-системах может быть полезным для автоматизации задач, однако требуются дополнительные шаги при использовании sudo. Заботьтесь о правильной настройке переменных окружения, чтобы избежать проблем с доступом к пользовательским службам и таймерам. Помните, что вся эта информация будет полезна только если вы осуществили правильную настройку прав доступа и конфигурации системы.

Если возникают дополнительные вопросы или проблемы, стоит обратиться к документации systemd или логам системы для более детального анализа.

Оцените материал
Добавить комментарий

Капча загружается...