web-dev-qa-db-ja.com

crontabでgsettingsを実行する

特定のフォルダー内の画像をランダムに取得して、壁紙(Ubuntu 18.04)を変更するためのシンプルなpythonスクリプトを作成しました。 gsettingsコマンドを使用します。手動で実行すると動作しますが、crontabで自動化する必要があります。

Crontabには、スクリプトを手動で実行したときに持っていたすべての変数がないため、次のエラーが発生しました。

(process:xxxxx): dconf-WARNING **: 15:07:01.547: failed to commit changes to dconf: Impossible de lancer automatiquement D-Bus sans $DISPLAY X11

だから私は次のような解決策を見つけました:

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

command = dbus_session_bus_address + 'gsettings set org.gnome.desktop.background picture-uri ' + getRandomImage()

ほとんどの人にとってはうまくいくようですが、問題があります。私のcrontabには権限がありません:

grep: /proc/$pid/environ: Permission denied
dconf-WARNING **: 15:19:01.514: failed to commit changes to dconf: The address indicated is empty 

したがって、Sudo crontab -eを指定してスクリプトを実行しますが、次のエラーが発生します。

dconf-WARNING **: 15:22:01.807: failed to commit changes to dconf: Connection is closed

また、私はユーザーのcrontabを使用することを好みます。それを行うための最良の方法は何ですか?

1
Rémi

Steeldriverのコメントのおかげで、解決策が見つかりました!

実際、_pgrep gnome-session_コマンドは2 PIDを提供します。
私が_ls -l /proc/_の場合、最初のpidディレクトリがgdm(Gnome Display Manager)に属し、2番目が私のユーザーに属していることがわかります。

したがって、私のスクリプトでは、PID=$(pgrep gnome-session | head -n1)PID=$(pgrep gnome-session | tail -n1)に置き換えるだけで、ユーザーに関連付けられたPIDを使用します。

このソリューション(_tail -n1_を使用)がすべての人に有効かどうかはわかりません。最善の方法は_pgrep gnome-session_コマンドを実行し、pidフォルダーの所有者を確認し、ユーザーに属するものを選択することだと思います。

それが役立つことを願っています!

2
Rémi