Этот простой сценарий работает правильно при запуске вручную:
#!/bin/sh
flatpak -y update 2>&1 >> ~/cron/cron-flatpak.log
При запуске с 00 07 * * * sh ~ /cron/cron-flatpak.sh
(тот же обычный пользователь, а не root crontab), он производит следующее:
Looking for updates…
1. org.chromium.Chromium.Codecs stable u flathub < 1.1 MB
2. org.chromium.Chromium.Locale stable u flathub < 112.8 kB (partial)
3. org.qbittorrent.qBittorrent stable u flathub < 8.3 MB
Updating 1/3…
Warning: Failed to get revokefs-fuse socket from system-helper: Flatpak system operation GetRevokefsFd not allowed for user
Updating 1/3… ██▌ 13% 41.1 kB/s
Updating 1/3… ████████████████████ 100% 674.8 kB/s
Updating 1/3… ████████████████████ 100% 674.8 kB/s
Updating 2/3…
Warning: Failed to get revokefs-fuse socket from system-helper: Flatpak system operation GetRevokefsFd not allowed for user
Updating 2/3… ████████████████████ 100% 592 bytes/s
Updating 3/3…
Warning: Failed to get revokefs-fuse socket from system-helper: Flatpak system operation GetRevokefsFd not allowed for user
Updating 3/3… ████████████████████ 100% 0 bytes/s
Updates complete.
После этого версии кажутся совпадающими с тем, что указано на flathub.io, но скрипт пытается обновить все снова и снова при каждом запуске. Есть предложения?
ETA: Хорошо, люди, я буду тестировать предложенные вами подходы, и я приму тот или иной ответ после того, как мне удастся заставить это работать. занять время, так как каждый итерация требует, чтобы новая версия приложения была размещена на flathub.
Это не столько решение, сколько обходной путь или возможная подсказка, а установка Chromium с флагом - user
(по умолчанию flatpak использует - system
) и обновление работает нормально в cron.
flatpak install flathub org.chromium.Chromium # default, has cron issues
flatpak install --user flathub org.chromium.Chromium # no cron issues
К сожалению, я не уверен, почему возможность обновлять системные пакеты упала в cron - по крайней мере для Chromium flatpak, поскольку похоже, что третий плоский пакет смог обновить только что. Может быть, проблема в том конкретном пакете.
Правка: я пропустил третью ошибку в выводе, она не была уникальной для Chromium.
Редактировать 2: Просто некоторые дополнительные пояснения / шаги по использованию флага - user
Flatpak. Поскольку системные и пользовательские пакеты управляются отдельно, это означает, что добавление / удаление пультов, установка и обновление также должны выполняться отдельно. Пользовательский пакет не может быть получен с системного удаленного компьютера и наоборот.
# add a user remote
flatpak remote-add --if-not-exists --user REMOTE_NAME REMOTE_ADDRESS
# updates just user packages
flatpak update --user
Нашел дешевое и грязное решение: запустить 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
С этими изменениями все обновляется без заминок. Настоящая причина, скорее всего, не в привилегиях как таковых, а в каких-то других изменениях в окружении, но, по крайней мере, это не заставляет меня переустанавливать все.
Если кто-то считает, что это плохая идея, пожалуйста, объясните почему.
Задания выполняются через cron
, или в
, или пакет
, не запускаются в той же среде выполнения, что и на вашем рабочем столе. Ни одно из изменений вашего PATH
или других настроек переменных среды не распространяется автоматически на ваше задание cron
. Например, нет $ DISPLAY
, поэтому программы с графическим интерфейсом требуют особого обращения (прочтите man xhost
).
Можно установить переменные среды для всех своих cron
заданий в файле crontab
Прочитать man 5 crontab
.
Посмотрите на результаты echo "=== set ==="; set; echo "=== env ==="; env | sort; echo "=== alias ==="; alias
в каждой из ваших сред.
Поскольку часть команды
в строке crontab
по умолчанию интерпретируется как / bin / sh
, синтаксис которого проще, чем у / bin / bash
, я рекомендую использовать команду
как вызов сценария bash
(исполняемый, смонтированный, начинается с #! / bin / bash
), который настраивает среду, а затем вызывает нужную программу.