У меня есть сценарий, который ежедневно проверяет веб-сайт 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 (вверху) и то, как оно должно выглядеть обычно (внизу).
Вы можете вернуться к старому стилю переключения окон, включив плагин Static Application Switcher в менеджере настроек CompizConfig:
Шаги:
CompizConfig Manager запускается через sudo apt-get install compizconfig-settings-manager
(спасибо @donbright)
sudo apt-get install compiz-plugins
, чтобы статический переключатель приложений появился. (спасибо @Milimetric)
CompizConfig Manager запускается путем ввода ccsm
в терминале (спасибо @donbright)
Отключите сочетания клавиш для переключателя Unity, сняв галочку с CompizConfig Settings Manager ▸ Desktop ▸ Ubuntu Unity Plugin ▸ Switcher ▸ Key для запуска переключателя ▸ Enabled и Key для запуска переключателя в обратном направлении ▸ Enabled
Включите статический переключатель приложений, отметив CompizConfig Settings Manager ▸ Window Management ▸ Static Application Switcher ▸ Enable Static Application Switcher
Я наконец-то решил эту проблему, перейдя с crontab на systemd service timer, который, похоже, лучше подходит для скриптов с элементами GUI.
Для протокола я хотел бы кратко описать, как я это сделал:
Создайте каталог и файл конфигурации для пользовательских сервисов systemd:
mkdir "/etc/systemd/user@.service.d"
sudo touch "/etc/systemd/user@.service.d/local.conf"
Скопируйте и вставьте в этот файл следующее:
[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"
Создаем каталог и получаем данные для настройки окружения пользователя:
mkdir "~/.config/environment.d"
systemctl --user show-environment > "~/.config/environment.d/user.conf"
Создаем каталог для файлов пользователя systemd:
mkdir "~/. config/systemd/user"
Создайте файл сервиса (например, "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
Включите вновь созданную службу и таймер:
systemctl --user enable test.timer
Задания, выполняемые через 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
), который настраивает среду, а затем вызывает нужную программу.