LINUX.ORG.RU

Как правильно сделать старт GUI через systemd

 ,


0

1

C НЕсистемд все вроде ясно, через правило udev стартуем скрипт который ждет запуска xorg и запускает GUI

С systemd такой фокус проходит лишь частично, GUI стартует, после чего по таймауту процесс убивается силами systemd. Ясно что надо писать сервис systemd, но что использовать, там щас какие-то *.wants варианты появились т.е. правило udev уже не нужно будет. Или привязываться к bluetooth.target

Как бы универсально запилить чтобы одно-другому не мешало?

В качестве устройства ожидается bluetooth-адаптер в виде встроенного или внешнего USB.

★★★★★

Как правильно сделать старт GUI через systemd

Никак. /thread

через правило udev стартуем скрипт который ждет запуска xorg и запускает GUI

Сделаю вид, будто я этого не заметил...

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

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

irton ★★★★★
() автор топика
Ответ на: комментарий от irton

как вариант написать скрипт python/perl или бинарь и ловить событие от udev-монитора, а сам скрипт/бинарь в автостарт WindowManagera - примерно вот так:

#!/usr/bin/perl
 
use strict;
use warnings;

use Udev::FFI;

my $udev = Udev::FFI->new() or
    die "Can't create Udev::FFI object: $@.\n";
 
my $monitor = $udev->new_monitor() or
    die "Can't create udev monitor: $@.\n";

# можно добавить фильтр
#$monitor->filter_by_subsystem_devtype('usb');

if($monitor->start()) {
    for(;;) {
        my $device = $monitor->poll(); # blocking read
        # если совпадает индетификатор девайса (vip, pid или пр.) - то запускаем приложение
    }
}
ilux
()
Ответ на: комментарий от irton

С systemd такой фокус проходит лишь частично, GUI стартует, после чего по таймауту процесс убивается силами systemd

Разовое действие через startup не годится т.к. При переходе в ждущий режим и обратно, устройство отключантся и заново подключантся.

написать правило udev, которое будет стартовать сервис systemd хдд

iTA05
()
Ответ на: комментарий от iTA05

Скорей уж в правиле udev мониторить наличие systemd и стартовать сервис, а в сервисе уже контролировать наличие адаптера... Но не убьет ли его опять сам системд.

irton ★★★★★
() автор топика
Последнее исправление: irton (всего исправлений: 1)
Ответ на: комментарий от irton

так udev monitor и есть часть udev'a и также ловит собития через libudev - только в собственном приложении/скрипте. если очень хочется можно написать демона на c/c++/Rust - строк ~30 получится

ilux
()
Ответ на: комментарий от irton

пусть udev мониторит подключение адаптера и стартует сервис, а при отключении останавливает (какая-то наркомания)

по идее, в системд же настраиваются как-то сетевые адаптеры, там и реакция на подключение/отключение наверн есть, вот по аналогии и сделать (но я не шарю)

iTA05
()
Ответ на: комментарий от ilux

вот именно что писать ничего не хочется и смысла не вижу пока. если все равно используется udev. Вобще c udev проблем нету, проблема когда системд в системе.

irton ★★★★★
() автор топика
Ответ на: комментарий от iTA05

intelfx шарит, но он сказал что так неправильно.

Программка привязана к наличию bluetooth адаптера в системе, нет адаптера - программа не запускается, появился адаптер - запускаем программу.

Да systemd заточен на запуск сервисов, но там же есть .device еще есть установка переменных окружения, проверку наличия xorg тоже как-то можно сделать через target например.

irton ★★★★★
() автор топика
Ответ на: комментарий от irton

Нет, никто тебе не запретит захардкодить в .service значение $DISPLAY, каким-то образом пробросить authority и запускать что хочешь, но это костыль и хардкод. Тебе никто не гарантирует, что твой скрипт запустится строго после запуска X-сервера (After=display-manager.service не поможет), ты никак не получишь остальные переменные окружения из графической сессии, у тебя сломается polkit и т. п.

Если для тебя это всё не проблема — хардкодь, кто ж тебе помешает. Но «правильно» эта задача с помощью systemd не решается никак.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

через запуск из udev работает и результат устраивает, как сделать чтобы systemd не убивал ее?

irton ★★★★★
() автор топика
Ответ на: комментарий от irton

Ну тогда нет проблем. Просто сделай Type=simple (или Type=forking) юнит и запускай его systemctl start'ом из RUN, чего уж проще.

Если нужно, чтобы systemd сам прибивал твою программу при отключении железки, тогда TAG+="systemd", ENV{SYSTEMD_WANTS}+="foo.service".

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

спасибо буду пробовать

irton ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Написал такой юнит bluetooth.service:

[Unit]
Description=Start bluez-tray applet
BindsTo=sys-subsystem-bluetooth-devices-hci0.device

After=bluetooth.target
Requires=graphical.target bluetooth.target

[Service]
Type=forking
ExecStart=/usr/bin/bluetooth.sh

В принципе к bluetooth.target можно не привязываться наверное, но вопрос по строчке BindsTo=, можно ли там указать вместо hci0 знак подстановки? может есть @ или что-то подобное?

irton ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.