Фон не меняется с помощью gsettings из cron

11

Я пытаюсь изменить обои на случайное изображение с помощью предложенного Индраджитом Индрапрастама сценария: Как изменить фон рабочего стола из командной строки в Unity?

Когда я запускаю скрипт из окна терминала, bg меняется очень хорошо, но когда он запускается из cron, я получаю эту ошибку по почте:

(процесс: 21901): dconf-WARNING **: не удалось зафиксировать изменения в dconf: ошибка создания командной строки 'dbus-launch --autolaunch = 00216c114dcf433c9bb9009985d607d6 --binary-syntax --close-stderr': дочерний процесс завершен с кодом 1

Буду признателен за любые предложения.

Shaun
источник
1
@ Мерри кроме того факта, что ответы там не решают проблему ОП (что, кстати, не сделало бы это обманом), как бы это было обманом ???? Та же ошибка не означает, что это один и тот же вопрос.
Джейкоб Влейм

Ответы:

16

Редактирование настроек из cron; отсутствует переменная окружения

Если вы запускаете сценарий из собственной среды (например, из окна терминала или из автозагрузки), будет установлен ряд переменных среды. cronоднако ваш скрипт запускается с ограниченным набором переменных среды.

Для gsettingsуспешного редактирования из cron, вам нужно установить DBUS_SESSION_BUS_ADDRESSпеременную окружения. Вы можете сделать это, добавив две строки в ваш скрипт, как описано здесь (и ниже).

Ваш скрипт, в том числе установка необходимой переменной

Сценарий здесь , отредактировано включить DBUS_SESSION_BUS_ADDRESSпеременное окружение, то становится:

#!/bin/bash

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

DIR="/home/indra/Pictures/wallpapers"
PIC=$(ls $DIR/* | shuf -n1)
gsettings set org.gnome.desktop.background picture-uri "file://$PIC"

Связанный: Запуск .sh каждые 5 минут

Якоб Влейм
источник
@Shaun Добро пожаловать! Рад, что это работает :)
Jacob Vlijm
1
Я пробую это с Корицей на Монетном дворе. Когда я запускаю это непосредственно из cli, я получаю «dconf-WARNING *: не удалось зафиксировать изменения в dconf: указанный адрес пуст». Раньше работал (из cli), без PID и DBUS_SESSION_ . (Но не от cron)
donquixote
1
@donquixote Попробуй PID=$(pgrep -f 'gnome-session' | head -n1)!
Янис Элмерис
Вы можете заменить DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)на $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ)Так как grep тоже получает имя переменной. Источник
wjandrea
1
pgrep gnome-sessionможет вернуть более одного pid, если в систему вошли несколько пользователей (каждый из которых запускает gnome-сеанс). Возможно, EUID=$(id --real --user)и PID=$(pgrep --euid $EUID gnome-session)был бы способ получить только PID, связанный с сеансом gnome текущего пользователя.
Unutbu