LINUX.ORG.RU

Автоматический перезапуск «падучих» пользовательских приложений (на примере telegram-desktop)

 , , ,


2

3

Дано: telegram-desktop, аварийно завершающий работу в произвольные моменты времени.

Требуется: отладить автоматически повторно запускать его.

Решение:

$ mkdir -p ${XDG_CONFIG_HOME:-${HOME}/.config}
$ cat > ${XDG_CONFIG_HOME:-${HOME}/.config}/telegram-desktop.service <<_EOF
[Unit]
Description=Telegram Desktop official messaging app

[Service]
Type=simple
ExecStart=/usr/bin/telegram-desktop
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=graphical.target
_EOF
$ systemctl --user daemon-reload
$ systemctl --user enable --now telegram-desktop.service

Решение рассчитано на простейший случай, когда «упавшее» приложение можно просто запустить, и оно продолжит работать.

RestartSec=1s — «костыль второго порядка», предложенный intelfx'ом в ходе дискуссии.

★★★★★

Последнее исправление: dexpl (всего исправлений: 1)

Ну сколько можно говорить, systemd --user не предназначен для запуска графических приложений.

Отсутствие синхронизации с X-сервером, несовпадение переменных окружения… Кстати, graphical.target в systemd --user вообще говоря не существует.

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

Дано: telegram-desktop, аварийно завершающий работу в произвольные моменты времени.

не, не дано, не бывает такого

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

systemd --user не предназначен для запуска графических приложений

Но ведь запускают же:

└► systemctl --user cat mpDris2.service
# /usr/lib/systemd/user/mpDris2.service
[Unit]
Description=mpDris2 - Music Player Daemon D-Bus bridge

[Service]
Restart=on-failure
ExecStart=/usr/bin/mpDris2
BusName=org.mpris.MediaPlayer2.mpd

[Install]
WantedBy=default.target
# WantedBy=daemon.target
— это /usr/lib/systemd/user/mpDris2.service из mpdris2-0.7-11.20190207git7bd3faa.fc29.noarch. Причем что у него, что у моего telegram-desktop в /proc/<PID>/environ есть и DISPLAY, и DBUS_SESSION_BUS_ADDRESS, и XAUTHORITY (с правильными значениями).

Как бы сделал ты?

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

что за дистр

Федора 29

откуда ставил ?

Федору или телегу? С mirror.yandex.ru и из rpmfusion соответственно.

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

Dbus никакого отношения к иксам не имеет, этот сервис отлично будет работать и в tty.

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

не, не дано, не бывает такого

Я за тебя рад. Не telegram-desktop, так что-нибудь другое, не пригодится тебе, так кому-нибудь еще (мне через год-другой, к примеру :).

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

Программы на PyQt вылятся постоянно, streamtuner2 например. Что как бы намекает на уместность питона в gui разработке. А в остальном согласен, если с драйверами норм, по и gtk и qt отлично работают.

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

Странно, у меня тоже Fedora 29 и telegram-desktop из rpmfusion. Ничего не падает. Иногда месяцами работает.

Deleted
()

Помню юзал какую-то музыкант-ориентированную рестартилку взаимосвязанных сервисов, даже с графической мордой, но никак не могу ни вспомнить, ни нагуглить.

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

Охотно допускаю неполадки с телегой на своей стороне. Однако, я достаточно ленив, чтобы накостылять автоперезапуск, но недостаточно — чтобы разобраться в причинах. Да, идейно правильнее было бы разобраться, и будь на месте телеги что-то более важное для меня — так и сделал бы (как минимум, попытался бы), но для телеги мне хватит и костылей.

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

не могу ни вспомнить, ни нагуглить

Там, где systemd есть из коробки, ничего вспоминать-гуглить не нужно (хотя, разумеется, можно).

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

Но ведь запускают же

mpdris2 — это не графическое приложение. Это переходник между mpd и дбасом. Ему в пользовательском systemd самое место (при условии, что mpd запускается оттуда же).

Причем что у него, что у моего telegram-desktop в /proc//environ есть и DISPLAY, и DBUS_SESSION_BUS_ADDRESS, и XAUTHORITY (с правильными значениями).

В гноме это обкостыливают: gnome-session-binary (или как оно там) при старте сессии пропихивает в systemd --user и в dbus-daemon --user своё текущее окружение. Но этот костыль сделан для другого (для dbus-activatable кусков гнома, которые запускаются в контексте systemd --user), а у тебя на этом месте возникнет гонка.

Как бы сделал ты?

Отличный вопрос. Хз.

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

У меня подобное решение не работало на KDE (оборачивал qBittorent).

Я ещё и всякие переменные окружения прокидывал. Видимо криво. Да и инфы довольно мало в интернете по поводу этого. Видимо systemd редко кто использует для запуска/перезапуска графических приложений.

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

mpdris2 — это не графическое приложение

Согласен.

В гноме это обкостыливают

У меня не гном, а винегрет вокруг lightdm и openbox вместо DE, но systemctl --user show-environment выдает много чего отличного от systemctl show-environment. Вывод — либо «обкостыливают» (термин улыбнул) не только в гноме, либо не так уж это и костыльно, либо гонка возникает, но где (и чем чревата? и как устранить)? К слову, dbus-daemon --user тоже нету, есть dbus-daemon --session.

Хз.

Значит, столкнусь с граблями — буду искать решение, а пока поживу так, раз уж самый заметный на LOR специалист по systemd (не шучу и не подкалываю) говорит «хз».

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

У меня подобное решение не работало на KDE (оборачивал qBittorent).

Похоже, intelfx об этом и говорит. У меня

└► systemctl --user show-environment
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DISPLAY=:0
HOME=/home/dexpl
LANG=ru_RU.utf8
LC_MESSAGES=C
LOGNAME=dexpl
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
SHELL=/bin/bash
USER=dexpl
XAUTHORITY=/var/run/lightdm/dexpl/xauthority
XDG_RUNTIME_DIR=/run/user/1000
, но откуда? Стоящую за этим «механику» представляю себе лишь в общих чертах и не факт, что правильно. Посмотрим, что-то будет после (нескорой) перезагрузки.

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

У меня не гном, а винегрет вокруг lightdm и openbox вместо DE

Значит, обкостыливают не только в гноме.

гонка возникает, но где (и чем чревата? и как устранить)?

Гонка возникает:

  • за окружение systemd --user
  • между:
    • твоим сервисом, который запускается в произвольный момент между basic.target и default.target (запуска basic.target ждёт pam_systemd.so и дальше возвращает управление) и читает из этого окружения, и
    • скриптом /etc/X11/xinit/xinitrc.d/50-systemd-user.sh, который запускается в начале Xorg-сессии в произвольный момент после того, как PAM вернул управление, и пишет в это окружение.
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 4)
Ответ на: комментарий от dexpl

либо «обкостыливают» (термин улыбнул) не только в гноме

Да.

Это я перепутал.

GNOME действительно так делает, но конкретно в данном случае ($DISPLAY и $XAUTHORITY) за это отвечает xinitrc.d-скрипт, который поставляется вместе с systemd, и запускается кем-то и где-то посередине настройки Xorg-сессии:

$ cat /etc/X11/xinit/xinitrc.d/50-systemd-user.sh
#!/bin/sh

systemctl --user import-environment DISPLAY XAUTHORITY

if command -v dbus-update-activation-environment >/dev/null 2>&1; then
        dbus-update-activation-environment DISPLAY XAUTHORITY
fi
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от Deleted

Ни разу в линуксе не падала телега.

This. Разве что память с процом жрала дико и приходилось ребутить.

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

Спасибо, насчет «где» понял (надеюсь), «чем чревата» — покажет практика, «как устранить» — буду выяснять по мере поступления граблей.

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

/etc/X11/xinit/xinitrc.d/50-systemd-user.sh

О, такое у меня есть, все костыли на месте, гонки не будет. Так?

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

«чем чревата» — покажет практика

С одной стороны на самом деле ничем не чревата, потому что эта твоя телега просто будет падать в цикле, пока не прилетит валидный $DISPLAY, но с другой стороны чревата тем, что ты потенциально упрёшься в StartLimit.

«как устранить» — буду выяснять по мере поступления граблей

Сделай RestartSec=1s (угу, костыль второго порядка) и можно в продакшен.

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

Сделай RestartSec=1s (угу, костыль второго порядка) и можно в продакшен.

Спасибо

// костыль второго порядка :)))

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

Собеседование на кодера в M$ прошёл. Вы приняты!!!111

targitaj ★★★★★
()

Дано: telegram-desktop, аварийно завершающий работу в произвольные моменты времени

УМВР. Дистр какой хоть?

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

Ну сколько можно говорить, systemd --user не предназначен для запуска графических приложений.
Отсутствие синхронизации с X-сервером, несовпадение переменных окружения…

У меня как раз всё это только в юзер единственном и есть

% systemctl show-environment
LANG=en_US.UTF-8
LANGUAGE=en_US
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
% systemctl --user show-environment
HOME=/home/fehhner
LANG=ru_RU.UTF-8
LANGUAGE=en_US:ru
LOGNAME=fehhner
MAIL=/var/spool/mail/fehhner
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/home/fehhner/.local/share/flatpak/exports/bin:/usr/lib/jvm/default/bin>
SHELL=/usr/bin/zsh
USER=fehhner
XDG_RUNTIME_DIR=/run/user/1000
XDG_DATA_DIRS=/home/fehhner/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/>
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DESKTOP_SESSION=/usr/share/xsessions/plasma
DISPLAY=:0
GS_LIB=/home/fehhner/.fonts
GTK_MODULES=canberra-gtk-module
HG=/usr/bin/hg
KDE_FULL_SESSION=true
KDE_SESSION_UID=1000
KDE_SESSION_VERSION=5
MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins
OLDPWD=/home/fehhner
PAM_KWALLET5_LOGIN=/run/user/1000/kwallet5.socket
PWD=/home/fehhner
QT_AUTO_SCREEN_SCALE_FACTOR=0
SHLVL=1
XAUTHORITY=/home/fehhner/.Xauthority
XCURSOR_SIZE=0
XCURSOR_THEME=breeze_cursors
XDG_CURRENT_DESKTOP=KDE
XDG_SEAT=seat0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_CLASS=user
XDG_SESSION_DESKTOP=KDE
XDG_SESSION_ID=1
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SESSION_TYPE=x11
XDG_VTNR=1
_=/usr/bin/dbus-update-activation-environment

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

[off topic]

systemctl --user show-environment

Ничего себе выхлоп! У меня скромненько в Debian:

HOME=/home/username
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LOGNAME=username
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
USER=username
XDG_RUNTIME_DIR=/run/user/1000

Интересно, почему? У тебя более свежий и сформировавшийся systemd?

[/off topic]

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

На арче понятно, что он свежий:

core/systemd 241.7-2 (base-devel) [installed]

Возможно, что дело и в плазме (некоторые нативные приложения не запускаются под рутом, только под пользователем):

% sudo dolphin
Executing Dolphin with sudo is not possible due to unfixable security vulnerabilities.
Под рукой нет установки без ДЕ проверить, но вроде это в системд в целом.

UPDATE: запустил из sddm сеанс голого Openbox без DE, картина абсолютно такая же.

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

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

И правильно сделали. Запускают от рута, потом идут на ЛОР и жалуются, что что-то не работает.

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

Я бы предположил влияние KDE, plasma либо чего-то, нужного для flatpak

Ну так там всё прописано - и кде плазма, и флетпак после установки. Ртуть есть там же (hg), но можно заметить и

DISPLAY=:0

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

Ну так там всё прописано

Это-то понятно, вопрос в том, как и зачем это все оказывается в выводе systemctl --user show-environment.

└► systemctl --user show-environment | wc -l; env | wc -l
11
56
dexpl ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Обернуть в systemd-run (надо посмотреть хотя обрабатывается ли опция с рестартом через него) и запускать через autostart иксов

Ещё можно даже в desktop файл завернуть

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

надо посмотреть хотя обрабатывается ли опция с рестартом через него

Сколь я вижу, нет. А жаль, хорошая идея была.

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