slytomcat / yandex-disk-indicator

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

Помогите добавить задержку запуска индикатора #219

Closed maxim221 closed 4 years ago

maxim221 commented 4 years ago

Здравствуйте!

Я использую индикатор для Ubuntu 18.04.4 LTS и сталкиваюсь с проблемой - папка для синхронизации находится на диске, который не успевает смонтироваться до запуска индикатора. Я пытался отключить автозапуск в меню индикатора и добавить его в автозапуск системы при помощи команды: sleep 10; yandex-disk-indicator однако так его запустить не удаётся. Вероятно нужно указать путь к папке где расположен сам индикатор, но я не понимаю что именно там запускать.

Пожалуйста помогите добавить задержку запуска. Как это можно сделать?

slytomcat commented 4 years ago

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

Кроме того, в большинстве случаев, когда вы настраиваете систему, лучше использовать абсолютные пути. В случае индикатора это будет /usr/bin/yandex-disk-indicator.

maxim221 commented 4 years ago

Большое спасибо за оперативный ответ! Написание юнита для systemd займёт у меня какое-то время. Как только я с этим разберусь - напишу что получилось.

slytomcat commented 4 years ago

Да, будет здорово если отпишитесь с готовым решением - я потом добавлю в FAQ. Это будет полезно другим.

maxim221 commented 4 years ago

Хм..

Я сделал скрипт и юнит для systemd

Вот этот скрипт: `#!/usr/bin/python

import os os.system("xhost +") os.system("/usr/bin/yandex-disk-indicator") ` а вот юнит:

`[Unit] Description = starts Yandex Disk Indicator when /media/kamensky/Data is mounted RequiresMountsFor=/media/kamensky/Data After=media-kamensky-Data.mount

[Service] RemainAfterExit=true ExecStop=/usr/local/bin/yaIndStart Type=oneshot

[Install] WantedBy=multi-user.target`

но честно говоря пока это не работает-) На форумах про systemd говорят то что systemd срабатывает до того как любой из пользователей успел залогиниться, то то что "графические утилиты" не запускаются через systemd корректно. Честно говоря мне кажется, что я просто неверно описываю условие. Так как уже на запущенной системе примонтирование диска не приводит к запуску, а что касается графических утилит - например teamViewer как раз через сервис systemd запускается. Продолжаю работу.

slytomcat commented 4 years ago

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

Сложности с ним в том, что ему как раз таки логин пользователя немного "параллелен"... Он умеет юниты пользователя запускать и без логина пользователя. Так например syncthing свой сервис стартует - пользователь еще не залогинен, а он уже стартанул причем под этим пользователем.

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

Я попробую тоже покопать эту тему. самому интересно стало...

slytomcat commented 4 years ago

Уточните, что у вас отвечает за монтирование тома для синхронизируемого каталога? Это что-то зашифрованное или просто через FUSE?

maxim221 commented 4 years ago

Нет нет. Ничего зашифрованного. У меня просто система стоит на SSD, а синхронизирую облако я в папку на другом диске. Насколько я понимаю его монтирование происходит с помощью fstab, простите мне недостаточную эрудицию-) Если включить автозагрузку то он не видит папку для синхронизации - в этом вся история.

slytomcat commented 4 years ago

Странно, обычно монтирование всех внутренних дисков происходит до достижения multi-user.target (т.е. вывода окна логина). Или это не встроенный диск а внешний?

maxim221 commented 4 years ago

Встроенный.. Работает по Sata также как и SSD С папкой на SSD проблем не было-) Но он небольшой. Буду пытаться дальше.

slytomcat commented 4 years ago

Вот нагуглил две вещи:

  1. дождаться логина пользователя: https://superuser.com/questions/1037466/how-to-start-a-systemd-service-after-user-login-and-stop-it-before-user-logout

  2. дождаться монтирования конкретного диска: https://unix.stackexchange.com/questions/441894/wait-to-start-transmission-daemon-until-after-usb-drive-has-mounted

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

maxim221 commented 4 years ago

Прекрасно! Благодарю. Буду пробовать завтра-)

maxim221 commented 4 years ago

Мне удалось написать модуль, но скрипт всё время выдавал ошибки запуска связанные с невозможностью получить доступ к папке пользователя. Я начал пытаться настроить систему под root'a, но вдруг неожиданно проблема решилась иначе:

Я изменил fstab для подключения диска в момент старта системы, добавив туда: /dev/disk/by-id/wwn-0x50014ee2ae19e944 /mnt/wwn-0x50014ee2ae19e944 auto nosuid,nodev,nofail,x-gvfs-show 0 0

где "wwn-0x50014ee2ae19e944" - это id моего диска (можно выяснить id командой ls -la /dev/disk/by-id/

Теперь всё работает как следует без модификаций индикатора, демона синхронизации или systemd

slytomcat commented 4 years ago

Можно было UUID раздела посмотреть в выводе sudo blkid и в fstab записать что-то такое

UUID=1fee3372-6592-4ed4-9730-ae84b4323828 /mnt/wwn-0x50014ee2ae19e944 auto nosuid,nodev,nofail,x-gvfs-show 0 0

Только я бы посоветовал вместо auto прописать ту файловую систему что используется на разделе. Это чуть быстрее будет работать.