Сценарий оболочки Crontab неправильно использует тему графического интерфейса

У меня есть сценарий, который ежедневно проверяет веб-сайт Caliber на наличие обновлений и уведомляет, когда доступна новая версия. Запись в crontab для нее такая:

0   12 * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus /home/sadi/.local/share/bin/cron-daily-jobs.zsh 2> /home/sadi/.local/share/cron-user.log 2>&1

Все работает нормально, за исключением внешнего вида диалогового окна, которое, похоже, игнорирует мою текущую тему (кроме оформления окна). Я подозреваю, что мне что-то не хватает в этой части перед именем пути к сценарию, чтобы сценарий использовал мою тему.

На снимке экрана показано диалоговое окно crontab (вверху) и то, как оно должно выглядеть обычно (внизу). enter image description here

0
задан 26 March 2021 в 12:36

2 ответа

Вы можете вернуться к старому стилю переключения окон, включив плагин Static Application Switcher в менеджере настроек CompizConfig:

Шаги:

  1. CompizConfig Manager запускается через sudo apt-get install compizconfig-settings-manager (спасибо @donbright)

  2. sudo apt-get install compiz-plugins, чтобы статический переключатель приложений появился. (спасибо @Milimetric)

  3. CompizConfig Manager запускается путем ввода ccsm в терминале (спасибо @donbright)

  4. Отключите сочетания клавиш для переключателя Unity, сняв галочку с CompizConfig Settings Manager ▸ Desktop ▸ Ubuntu Unity Plugin ▸ Switcher ▸ Key для запуска переключателя ▸ Enabled и Key для запуска переключателя в обратном направлении ▸ Enabled

  5. Включите статический переключатель приложений, отметив CompizConfig Settings Manager ▸ Window Management ▸ Static Application Switcher ▸ Enable Static Application Switcher

. 121---893071-

Я наконец-то решил эту проблему, перейдя с crontab на systemd service timer, который, похоже, лучше подходит для скриптов с элементами GUI.

Для протокола я хотел бы кратко описать, как я это сделал:

  1. Создайте каталог и файл конфигурации для пользовательских сервисов systemd:

    mkdir "/etc/systemd/user@.service.d"

    sudo touch "/etc/systemd/user@.service.d/local.conf"

  2. Скопируйте и вставьте в этот файл следующее:

[Service]
Environment="PATH=/usr/lib/ccache/bin:/usr/local/bin:/usr/bin:/bin"
Environment="EDITOR=nano -c"
Environment="BROWSER=firefox"
Environment="NO_AT_BRIDGE=1"
  1. Создаем каталог и получаем данные для настройки окружения пользователя:

    mkdir "~/.config/environment.d"

    systemctl --user show-environment > "~/.config/environment.d/user.conf"

  2. Создаем каталог для файлов пользователя systemd:

    mkdir "~/. config/systemd/user"

  3. Создайте файл сервиса (например, "test.service") и соответствующий файл таймера (например, "test.timer") для каждого задания:

Пример содержимого файла сервиса:

[Unit].
Описание=Провести тест таймера службы systemd

[Service]
ExecStart=~/.local/bin/test

[Install]
WantedBy=default.target

Образец содержимого служебного файла:

[Unit]
Описание=Запускать тестовую службу каждые 10 минут

[Timer]
OnCalendar=*:0/10:0
Persistent=false

[Install]
WantedBy=default.target
  1. Включите вновь созданную службу и таймер:

    systemctl --user enable test.timer

0
ответ дан 23 April 2021 в 23:30

Задания, выполняемые через 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 ), который настраивает среду, а затем вызывает нужную программу.

1
ответ дан 23 April 2021 в 23:30

Другие вопросы по тегам:

Похожие вопросы: