Flatpak не обновляет свои приложения, когда они запускаются через cron.

Вопрос или проблема

Этот простой скрипт работает корректно при ручном запуске:

#!/bin/sh

flatpak -y update 2>&1 >> ~/cron/cron-flatpak.log

Когда его запускают с помощью 00 07 * * * sh ~/cron/cron-flatpak.sh (тот же регулярный пользователь, не root crontab), он выдает следующее:

Ищу обновления…

 1.     org.chromium.Chromium.Codecs    stable  u   flathub < 1.1 MB
 2.     org.chromium.Chromium.Locale    stable  u   flathub < 112.8 kB (частичное)
 3.     org.qbittorrent.qBittorrent stable  u   flathub < 8.3 MB

Обновление 1/3…                                                                 
Предупреждение: Не удалось получить сокет revokefs-fuse от system-helper: Операция Flatpak GetRevokefsFd не разрешена для пользователя

Обновление 1/3… ██▌                   13%  41.1 kB/s
Обновление 1/3… ████████████████████ 100%  674.8 kB/s
Обновление 1/3… ████████████████████ 100%  674.8 kB/s
Обновление 2/3…                                                                 
Предупреждение: Не удалось получить сокет revokefs-fuse от system-helper: Операция Flatpak GetRevokefsFd не разрешена для пользователя

Обновление 2/3… ████████████████████ 100%  592 bytes/s
Обновление 3/3…                                                                 
Предупреждение: Не удалось получить сокет revokefs-fuse от system-helper: Операция Flatpak GetRevokefsFd не разрешена для пользователя

Обновление 3/3… ████████████████████ 100%  0 bytes/s
Обновления завершены.

После этого версии, кажется, соответствуют тем, что указаны на flathub.io, но скрипт пытается обновить все снова и снова при каждом запуске. Есть какие-нибудь предложения?

ETA: Ладно, народ, я буду тестировать предложенные вами подходы и приму один ответ или другой, как только смогу сделать это работающим. Потребуется время, так как каждая новая итерация требует новой версии приложения, выпущенной на flathub.

Это не столько решение, сколько обходной путь или возможная подсказка, но установка Chromium с флагом --user (flatpak по умолчанию использует --system) и обновление работает нормально в cron.

flatpak install flathub org.chromium.Chromium # по умолчанию, есть проблемы с cron
flatpak install --user flathub org.chromium.Chromium # без проблем с cron

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

Правка: Я пропустил третью ошибку в выводе, она была не уникальна для Chromium.

Правка 2: Просто еще немного разъяснений/шагов для использования флага --user flatpak. Так как системные и пользовательские пакеты управляются отдельно, это означает, что добавление/удаление удаленных репозиториев, установка и обновление также должны выполняться отдельно. Пользовательский пакет не может получать данные из системного репозитория и наоборот.

# добавление пользовательского удаленного репозитория
flatpak remote-add --if-not-exists --user REMOTE_NAME REMOTE_ADDRESS

# обновляет только пользовательские пакеты
flatpak update --user

Задания, выполняемые через cron, at или batch, не выполняются в том же окружении выполнения, что и на вашем рабочем столе. Ни одно из ваших изменений PATH или настройки других переменных окружения автоматически не передаются в вашу задачу cron. Например, нет $DISPLAY, поэтому GUI-программы требуют особого подхода (читайте man xhost).

Можно установить переменные окружения для всех своих задач cron в файле crontab
Читайте man 5 crontab.

Посмотрите на результаты echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias в каждой из ваших сред.

Поскольку часть command строки crontab по умолчанию интерпретируется /bin/sh, который имеет более простой синтаксис, чем /bin/bash, я рекомендую сделать так, чтобы command вызывал скрипт bash (исполняемый, смонтированный, начинается с #!/bin/bash), который настраивает окружение, а затем вызывает нужную программу.

Нашел дешевое и простое решение: запускать flatpak через cron с помощью sudo. Существует как минимум 3 способа сделать это; я выбрал добавить flatpak в sudoers вот так:

Cmnd_Alias FLATPAK = /usr/bin/flatpak
myusername ALL=(ALL) NOPASSWD: FLATPAK

Скрипт изменился соответственно:

#!/bin/sh

sudo /usr/bin/flatpak -y update 2>&1 >> ~/cron/cron-flatpak.log

С этими изменениями все обновляется без проблем. Настоящая причина, скорее всего, не в самих привилегиях, а в каком-то другом изменении в окружении, но, по крайней мере, мне не нужно переустанавливать все.

Если кто-то считает, что это плохая идея, пожалуйста, объясните, почему.

Самое стабильное рабочее решение, которое я нашел для этой проблемы, — это просто запускать flatpak upgrade через cron root вместо cron пользователя.

используйте

sudo crontab -e

чтобы редактировать страницу crontab вашего root и добавьте что-то вроде

00 * * * * flatpak -y update

Ответ или решение

Почему Flatpak не обновляет приложения, когда он запускается из Cron?

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

1. Различия в окружении

Когда вы запускаете скрипт вручную, он исполняется в контексте вашей пользовательской оболочки, где доступны все изменения переменных окружения, включая PATH и другие настройки. В отличие от этого, задачи, выполняемые через cron, запускаются в очень ограниченном окружении. По умолчанию в cron нет таких переменных, как $DISPLAY, что может приводить к проблемам при выполнении графических приложений и некоторых системных операций.

Рекомендуется ввести необходимые переменные окружения в начале самого скрипта или указать их в crontab, чтобы сделать рабочую среду более близкой к интерактивной:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

2. Ошибки доступа

В логах, которые вы привели, наблюдаются предупреждения, связанные с правами доступа:

Warning: Failed to get revokefs-fuse socket from system-helper: Flatpak system operation GetRevokefsFd not allowed for user

Flatpak имеет разные уровни доступа для системных и пользовательских установок (использование флага --user для установки и обновления). Как было отмечено, приложения, установленные с помощью --system, могут потребовать более глубоких системных операций, которые могут быть запрещены в окружении cron для обычного пользователя.

3. Альтернативные подходы

  1. Использование флага --user: Исполнение Flatpak в контексте пользователя может быть решением для избежания проблем с доступом. Например, вы можете модифицировать скрипт, используя:

    #!/bin/sh
    flatpak -y --user update 2>&1 >> ~/cron/cron-flatpak.log

    Это обеспечит использование пользовательских установок, которые не требуют повышенных привилегий.

  2. Запуск через sudo: Это менее предпочтительное решение, так как выполнение с правами суперпользователя может представлять определённые риски безопасности. Но если это необходимо, вы можете добавить команду flatpak в sudoers, чтобы исключить запросы пароля:

    Cmnd_Alias FLATPAK = /usr/bin/flatpak
    myusername ALL=(ALL) NOPASSWD: FLATPAK

    Затем измените скрипт:

    #!/bin/sh
    sudo /usr/bin/flatpak -y update 2>&1 >> ~/cron/cron-flatpak.log
  3. Использование cron для суперпользователя: Запускить обновления Flatpak от имени пользователя root через crontab для root может быть простым и эффективным решением. Для этого выполните:

    sudo crontab -e

    И добавьте строку:

    00 07 * * * flatpak -y update

Эти подходы помогут избежать многих проблем, связанных с выполнением обновлений Flatpak через cron. Выбор решения зависит от специфики вашей системы и требуемого уровня безопасности.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...