slytomcat / yandex-disk-indicator

Panel indicator (GTK+) for YandexDisk CLI client for Linux
GNU General Public License v3.0
241 stars 30 forks source link

Sometimes two instances of the yandex-disk-indicator are started #233

Closed timamus closed 1 year ago

timamus commented 1 year ago

При старте Linux Mint без активного подключения к интернету часто запускается два экземпляра yandex-disk-indicator. Почему так?

slytomcat commented 1 year ago

Трудно ответить без дополнительных деталей. Могу только предположить.

В индикаторе есть защита от повторного запуска.

Возможно у вас запуск индикатора прописан в двух местах. В любом DE есть более одного метода автоматического запуска + можно и другими средствами запуск осуществить при логине пользователя. Когда интернет есть и один из методов проскакивает вперед и второй падает. А когда интернета нет тот что первый на старте как-то подвисает и второй успевает запуститься.

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

slytomcat commented 1 year ago

Попробуйте установить индикатор из исходников мастер ветки. Я там перенес проверку на повторный запуск на самую раннюю стадию запуска индикатора. По идее такое должно лучше работать на отлов дублей и вполне возможно исправит проблему с двумя запусками. Однако это все равно не отменяет вопроса: откуда он два раза у вас запускается....

Кстати, понять откуда запускаются индикаторы довольно просто, когда два индикатора запустились: pgrep yd-tools - покажет PID-ы запущенных индикаторов, а pstree -s -p $pid покажет цепочку запуска для процесса $pid.

timamus commented 1 year ago
pgrep yd-tools
1972
pstree -s -p 1972
systemd(1)───lightdm(1161)───lightdm(1419)───cinnamon-sessio(1472)───yd-tools(1+

Вроде не критично, но иногда это выглядит вот так у меня на двух ПК со свежей Linux Mint Vera. Если закрыть один исчезают оба индикатора. Дело наверное не в процессе... Снимок экрана от 2023-02-19 11-10-18

timamus commented 1 year ago

Индикатор ставил вот так:

# Installing yandex-disk-indicator
echo -en "\033[1;33m Installing yandex-disk-indicator... \033[0m \n"
sudo add-apt-repository ppa:slytomcat/ppa -y
sudo apt update && sudo apt install -y yd-tools
timamus commented 1 year ago

Индикатор запускается по пути ~/.config/autostart/Yandex.Disk-indicator.desktop. Временно убирал файл, ничего не запускалось тогда.

slytomcat commented 1 year ago

Тогда проблема в чем-то другом.

Индикатор умеет работать с несколькими аккаунтами, и в таком случае он рисуется несколькими иконками (каждая иконка под свой аккаунт).

То что у вас похоже именно на такой кейс, и возможно у вас два аккаунта прописано в ~/.config/yd-tools/yandex-disk-indicator.conf (будет не лишним его тоже показать).

Но тогда встает другой вопрос: а почему при наличии интернета индикатор для второго аккаунта не появляется...

timamus commented 1 year ago

Файл yandex-disk-indicator.conf выглядит вот так:

autostart="yes"
notifications="no"
theme="no"
fmextensions="yes"
daemons="/home/user/.config/yandex-disk/config.cfg"
slytomcat commented 1 year ago

А при клике по обоим иконкам открывается меню?

Тут посмотрел весь код внимательно, и если это не какой-то чудесный глюк, то никак в коде индикатор задвоиться не может. Но, остаются плагины панели. Вот с ними в современных DE изрядный бардак. Возможно там у вас в панели есть два плагина, через которые индикатор может показаться (просто еще одно предположение). И вот при старте без сети код сначала добавляет иконку, а потом пытается достучаться до демона и уже обновить иконку согласно статусу демона. Что там под капотом у библиотеки appindicator - я точно не знаю, но возможно происходит какое-то нарушение связи со старой иконкой и он добавляет новую (или происходить что-то подобное). А при быстром старте (при наличии сети) все проходит штатно.

Что бы я предложил: а попробуйте отключить некоторые плагины панели - вполне возможно это даст эффект.

avmaksimov commented 1 year ago

Аналогичная ситуация. Если завершить через меню один индикатор, то второй также завершается.

Ubuntu 22.10.

slytomcat commented 1 year ago

avmaksimov, а можно больше деталей. yandex-disk-indicator.conf

avmaksimov commented 1 year ago

avmaksimov, а можно больше деталей. yandex-disk-indicator.conf Без проблем. Кстати, ощущение, что проблема именно при включении компьютера. При перезагрузке проблемы нет.

autostart="yes" notifications="yes" theme="no" fmextensions="yes" daemons="/home/andrei/.config/yandex-disk/config.cfg"

Вот и немного измененный конфиг демона Яндекса (без личных данных): auth="/home/user/.config/yandex-disk/passwd" dir="/mnt/non-system-drive/Data/Yandex.Disk" proxy="no" exclude-dirs="Folder1, Folder2"

startonstartofindicator="yes" stoponexitfromindicator="yes"

slytomcat commented 1 year ago

avmaksimov, а можете проверить мою теорию с плагинами DE?

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

avmaksimov commented 1 year ago

avmaksimov, а можете проверить мою теорию с плагинами DE?

Попробуйте по-отключать некоторые из тех что за индикацию отвечают. По конфигу и коду должен один индикатор создаваться. И меню у индикаторов должны быть полностью идентичные. У вас это так? Тут такое интересное дело). У меня была Убунту 22.04 TLS. Я обновил до 22.10 и похоже, что все расширения накрылись). Теперь ни одно из них не отображается, но т.к. систему расширения настроили, то всё отображается как есть - более похоже на Windows - кнопка Пуск без категорий и со значками плюс трей справа).

Так что, даже не знаю, что отключать. В списке расширений пусто и если что-то искать, то отображается Unsupported. По ходу, зря обновился не до TLS.

Почитал вашу идею насчёт плагинов - звучит похоже. Как вариант, может после инициализации вам проверять на две иконки и удалять ненужную?

slytomcat commented 1 year ago

А где проверить то? Индикатор создается один раз через библиотеку AppIndicator и что там сама эта библиотека делает внутри плагинов - уже вне контроля. Тем более не может приложение рулить плагинами - ими рулит пользователь.

avmaksimov commented 1 year ago

Я предположил, что вы как-то создаёте "иконку" и, наверняка, есть способ уничтожить её. Возможно, есть другая библиотека для проверки и создания иконок. Не знаком так хорошо с Пайтоном или с библиотекой. Сужу по другим языкам.

slytomcat commented 1 year ago

Там сейчас все идет в противоположную сторону.

У меня есть проект yd-go, который (с недавнего времени) вообще не знает кто будет рисовать индикатор: он на уровне D-Bus ищет провайдера org.kde.StatusNotifierItem, который будет рисовать и через него организует работу индикатора. Т.е. нет не то что контроля за тем что именно нарисуется и как, но даже нет понимания какой именно сервис реализует этот D-bus интерфейс. И все управление на уровне строго описанного протокола d-bus .

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

Там в последних ubuntu начали затягивать AyatanaAppIndicator - а там все очень глючно и рисуют индикаторы как раз два сервиса один из них реализует поддержку сервиса org.kde.StatusNotifierItem, но он зачем-то пересылает все сообщения другому сервису... Я вполне допускаю, что в 22.00 скещены кашалот с бегемотом: работают сразу несколько плагинов панели, которые выводят иконки приложений и из-за этого и возникает это задвоение.

Кстати про yd-go, а можете его попробовать - он будет задваивать иконки?

avmaksimov commented 1 year ago

попробую. Я могу использовать две программы? Вылетает почти на любое действие и настроек нет, это нормально? Пока только пишется?

slytomcat commented 1 year ago

Индикаторы (yd-go и yandex-disk-indicator) - это просто обертки вокруг yandex-disk утилиты/демона.

Они оба отслеживают изменения в файле ~/Yandex.Disk/.sync/cli.log (туда демон yandex-disk пишет про любые изменения своего статуса) и как только файл изменился вызывается yandex-disk status и полученный вывод парсится для определения текущего состояния. В этом оба индикатора ведут себя совершенно одинаково и по идее работе друг друга мешать не должны.

yd-go немного проще чем yandex-disk-indicator. Там у него прямо в меню несколько настроек самого индикатора. Никакие настройки yandex-disk в GUI там не вытаскивались (ибо и не стоит тянуть на себя ответственность за конфигурацию посторонней, по сути, утилиты). Кроме того там нет ничего про поддержу actions файловых менеджеров и установку/настройку yandex-disk. Т.е. yd-go - чистый индикатор без всяких блекджеков и ...

Но вот в том как они выводят сам индикатора разница большая. yandex-disk-indicator использует библиотеку GTK AppIndicator (и потому завязан на GDE). yd-go - зависит только от наличия поддержки интерфейса org.kde.StatusNotifierItem через D-bus. Т.е. должен работать в практически любом DE. Но как я уже выше говорил - есть нюансы... нюансы реализации тех самых сервисов, которые этот самый интерфейс поддерживают...

Теперь к остальным вашим вопросам: "Вылетает почти на любое действие и настроек нет, это нормально?" я могу представить как например пчелы из улья вылетают, но что именно вы имеете в виду я представить не могу. Есть какие-то логи вылетов, или что-то еще. Запускайте yd-go через терминал с ключом -debug, и присылаете репорт в ишью yd-go (это другой репозиторий).

yd-go - уже не первый год и он вполне рабочий. Но на работу через D-bus он переделан не так давно.

avmaksimov commented 1 year ago

Странные у вас для программиста ассоциации с "вылетает". Это означает, что процесс "падает"))) (это значит, экстренно завершается - сам или более высоким процессом / ОСью).

slytomcat commented 1 year ago

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

slytomcat commented 1 year ago

А на сообщения "вылетает..." могу ответить только своими ассоциациями на этот отнюдь не однозначный глагол (как и на глагол "падает")))).

slytomcat commented 1 year ago

Вот что нагуглил по поводу задвоения иконок (это оказывается довольно общая проблема при апгрейде операционки).

Проблема как правило вызвана задвоением плагинов выводящих иконки. К приложениям (чьи иконки задваиваются) эта проблема отношения не имеет. Проблему нужно решать именно выносом из панели (и возможно из системы) дублирующих плагинов/сервисов.

Так что закрою как не относящиеся к индикатору.

timamus commented 1 year ago

Я нашел решение вот здесь Duplicate Transmission icon in the XApp Status Applet. Выполнение команды cat ~/.xsession-errors показывала вот это:

Gjs-Message: 15:48:10.259: JS LOG: [LookingGlass/info] Adding XAppStatusIcon: yandex-disk-indicator (:1.139/org/x/StatusIcon/Icon)
Gjs-Message: 15:48:11.063: JS LOG: [LookingGlass/info] Adding systray: yandex-disk- (16x16px)

Похоже, что проблема действительно никак не связана с индикатором! Перевод ответа из статьи дословно "Окей, не очевидно почему, но transmission загружается дважды в этом выводе, один раз в апплете xappstatus, а затем немного позже в виде устаревшего значка systray. Я бы попробовал с небольшой задержкой (скажем, 5 секунд) для вашего элемента запуска для transmission и посмотрел, позволит ли это избежать проблемы."

Я добавил в конец файла /home/user/.config/autostart/Yandex.Disk-indicator.desktop строку X-GNOME-Autostart-Delay=5. И на протяжении продолжительного времени не наблюдаю проблему. Теперь вопрос, возможно ли добавить строку X-GNOME-Autostart-Delay=5 в конфигурацию индикатора?

avmaksimov commented 1 year ago

возможно ли добавить строку X-GNOME-Autostart-Delay=5 в конфигурацию индикатора?

Добавил, но сегодня загрузилась одна иконка. Надо потестировать несколько дней. Если всё получится, я думаю, это будет хорошим решением.

avmaksimov commented 1 year ago

Пока полёт нормальный. Если что, напишу. Думаю, можно считать это решением!

Спасибо!

s1t1n commented 7 months ago

Добавил, как и рекомендовано, в конец файла /home/user/.config/autostart/Yandex.Disk-indicator.desktop строку X-GNOME-Autostart-Delay=5. Проблема решена. Спасибо!!!