Вопрос или проблема
Этот простой скрипт работает корректно при ручном запуске:
#!/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. Альтернативные подходы
-
Использование флага
--user
: Исполнение Flatpak в контексте пользователя может быть решением для избежания проблем с доступом. Например, вы можете модифицировать скрипт, используя:#!/bin/sh flatpak -y --user update 2>&1 >> ~/cron/cron-flatpak.log
Это обеспечит использование пользовательских установок, которые не требуют повышенных привилегий.
-
Запуск через 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
-
Использование cron для суперпользователя: Запускить обновления Flatpak от имени пользователя root через crontab для root может быть простым и эффективным решением. Для этого выполните:
sudo crontab -e
И добавьте строку:
00 07 * * * flatpak -y update
Эти подходы помогут избежать многих проблем, связанных с выполнением обновлений Flatpak через cron. Выбор решения зависит от специфики вашей системы и требуемого уровня безопасности.
Заключение
Проблемы с обновлением приложений Flatpak при использовании cron возникают главным образом из-за различий в окружении и управлении доступом. Рекомендуется следовать указанным рекомендациям, чтобы обеспечить успешное выполнение обновлений. Помните о рисках, связанных с повышением привилегий и безопасностями вашего окружения, и выбирайте решения, которые соответствуют вашему сценарию использования.