Раньше было можно, теперь падает. - возьмите систему с lightdm - установите пакет gnome-regular - выберете сеанс "Классический GNOME c Xorg" - войдите в систему Ожидание: запустится классический GNOME Реальность: что-то падает и снова появляется приглашение входа в систему от lightdm.
При этом у пользователя в ~/.xsession-errors:0 появляется что-то такое: Running Xsession[13468] env GNOME_SHELL_SESSION_MODE=classic gnome-session Agent pid 13511 runwm: window manager "env gnome_shell_session_mode=classic gnome-session" not found.
Примерная цепочка событий: Для старта сессии нужно запустить такую команду: # grep ^Exec /usr/share/xsessions/gnome-classic-xorg.desktop Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session lightdm по умолчанию пытается эту команду завернуть в Xsession: # grep ^session-wrapper /etc/lightdm/lightdm.conf session-wrapper=/etc/X11/Xsession Однако раз session-wrapper есть, вся строка из Exec попадает в один, первый аргумент session-wrapper'а (т.е. /etc/X11/Xsession), вместо того чтобы разделиться на отдельные аргументы: https://git.altlinux.org/gears/l/lightdm.git?p=lightdm.git;a=blob;f=lightdm/src/seat.c;h=09c78004f4ee72cf09be075b34f35527f71c7adf#l942 /etc/X11/Xsession (пакет xinitrc) видит, что его первый аргумент -- это не абсолютный путь к бинарнику, и передаёт его в rundm https://git.altlinux.org/gears/x/xinitrc.git?a=blob;f=xinitrc/install/etc/X11/Xsession;h=4dc829853de54fa74f77d0435539cfa2dfde23ea#l219 rundm, естественно, к такому не готов.
> Примерная цепочка событий: [...] То есть, сейчас получается, что lightdm работает, только если в Exec указан полный путь к исполняемому файлу, причём без аргументов. Спецификация на desktop-файлы[1] разрешает указывать имена без пути (чтобы их поискали в $PATH) и аргументы через пробел. Так что если в /usr/share/xsessions лежат обычные настоящие desktop-файлы без каких-либо дополнительных ограничений, lightdm неправ в том, как он их обрабатывает. [1] https://specifications.freedesktop.org/desktop-entry-spec/latest/exec-variables.html
Да, как единую строку читает "Exec": https://git.altlinux.org/gears/l/lightdm.git?p=lightdm.git;a=blob;f=lightdm/src/session-config.c;h=e0bca920eea15a6afe62457abb25468645054a1f;hb=0c7668cc9d018f80cd3e3b602ae1f76f63150288#l32 Нужно сделать разбиение на аргументы командной строки, вероятно, с учётом возможного экранирования. Нет ли на этот счёт известного готового решения?
(In reply to manowar@altlinux.org from comment #4) > Нужно сделать разбиение на аргументы командной строки, вероятно, с учётом > возможного экранирования. Нет ли на этот счёт известного готового решения? В том же get_session_argv чуть ниже используется g_shell_parse_argv из glib. На первый взгляд оно делает всё что нужно.
Спасибо, и правда. Осталось понять тогда, почему в lightdm в случае, когда есть обёртка, всё укладывается в один аргумент. То есть, как будто бы специально это сделано.
Да, я нашёл комит специально отменяющий правильное, на наш взгляд, поведение: https://git.altlinux.org/people/manowar/packages/?p=lightdm.git;a=commitdiff;h=964619ba615cd6c57070ad59cdcca8f132d9dfb1 .
https://github.com/canonical/lightdm/issues/381
Ну как бы вот: это что-то убунто-специфическое и старое: --- a/tests/src/lightdm-session +++ b/tests/src/lightdm-session @@ -1,5 +1,4 @@ #!/bin/sh -# Run the session expecting the full command to be the first argument. It has -# to be like this for backwards compatibility instead of having a normal argument list -exec $1 +# Run the session expecting an argument list. +exec "$@" Но мы вполне можем сделать по своему, мне кажется.
Сделал: https://git.altlinux.org/people/manowar/packages/?p=lightdm.git;a=commitdiff;h=1055b1486093458dbaf2dedc53f267597479e1ee Но не особо полегчало-то. :) Теперь: runwm: window manager "env" not found. Оно и понятно, раз > Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session и > /etc/X11/Xsession (пакет xinitrc) видит, что его первый > аргумент -- это не абсолютный путь к бинарнику, и передаёт > его в rundm
> runwm: window manager "env" not found. А разве "env" не должен привратиться в /usr/bin/env? То есть, разве g_find_program_in_path (argv[0]) не нужен и в ветке if-a c session-wrapper?
Так он там есть: + if (session_wrapper) + { + path = g_find_program_in_path (session_wrapper); + prepend_argv (&argv, path ? path : session_wrapper); + }
А, не сразу понял твою мысль, извини. :)
lightdm-1.32.0-alt9 -> sisyphus: Fri Oct 25 2024 Paul Wolneykien <manowar@altlinux> 1.32.0-alt9 - Fix: Invoke session wrapper with splitted arguments (closes: 51809).
Спасибо!