Вопрос или проблема
Согласно этому ответу, я включил длительное использование для пользователя на безголовой системе. Однако в 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
или логам системы для более детального анализа.