A solução
Descobri que o ponto cego era um buraco no meu conhecimento. A razão para não executar comandos específicos no script python ( gsettings set
) foi porque o cron usa um conjunto muito restrito de variáveis de ambiente.
Para executar um comando gsettings *set*
do cron (em geral), é preciso mais do que apenas executá-lo a partir do seu arquivo cron pessoal; a variável de ambiente DBUS_SESSION_BUS_ADDRESS é necessária para a execução correta.
Por razões de conveniência e flexibilidade, resolvi-o, inspirado e baseado nas informações em esta publicação sobre estouro de pilha , criando um script "intermediário" que exporta a variável e chama o script real. O script real edita gsettings
. Como (normalmente) um processo herda o ambiente de seu pai, agora o script é executado corretamente.
#!/bin/bash
PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-);/path/to/script.py
(assumindo que script.py é executável)
Incluindo a variável DBUS_SESSION_BUS_ADDRESS em um script python
Para tornar a edição gsettings
possível por um script python, executado pelo cron (e tornar um script intermediário desnecessário), a função abaixo poderia ser incluída no script. Deve ser chamado antes da função gsettings set
no script.
#!/usr/bin/env python3
import os
import subprocess
def set_envir():
pid = subprocess.check_output(["pgrep", "gnome-session"]).decode("utf-8").strip()
cmd = "grep -z DBUS_SESSION_BUS_ADDRESS /proc/"+pid+"/environ|cut -d= -f2-"
os.environ["DBUS_SESSION_BUS_ADDRESS"] = subprocess.check_output(
['/bin/bash', '-c', cmd]).decode("utf-8").strip().replace("#!/bin/bash
PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-);/path/to/script.py
", "")