cronを使い、gnomeの設定を変更して壁紙を変えることをしていたが、一年程前から動かなくなっていた。
スクリプトは、RESTぶるさんのGNOME用壁紙チェンジャーをこっそり使わせてもらっていた。
gconftool-2を使って壁紙を変えている。

現象としては、コマンドでは普通に動くのに、cronで起動すると動かない。
動かないとは、.gconf以下の対象のxmlは変更されているにもかかわらず、壁紙は変わらず、gconf-editorにも変化がない。

動かなくなった原因は、 このバグレポート にあるとおり。

  • この挙動は仕様どおりだそう。
  • gconftool-2 と gconfd のプロセス間通信には CORBA を使っていたが、D-Bus に変更したらしい。
  • D-Bus を使うには、DBUS_SESSION_BUS_ADDRESS が必要らしい。
  • gconftool-2 を起動する cron は、DBUS_SESSION_BUS_ADDRESSを知らないので、通信に失敗するらしい。
  • gconftool-2 --ping の終了ステータスで、失敗を確認できる。
  • cron に DBUS_SESSION_BUS_ADDRESS を教えると起動できるようになるらしい。

上記リンク先のリンク先では、DISPLAY=:0.0 で起動に成功したという報告があったが、自分の環境では失敗した。
対応としては、いただいたソース中の gconftool-2 起動前に、下記を挿入した。

USER = (`whoami`).chomp!

FILES = Dir.glob("/home/#{USER}/.dbus/session-bus/*")
File::open(FILES[0], File::RDONLY){ |f|
  f.each{|line|
    if /^DBUS_SESSION_BUS_ADDRESS=(.*)$/ =~ line
        DBUS_SESSION_BUS_ADDRESS=$1
    end
  }
}
ENV["DBUS_SESSION_BUS_ADDRESS"]=DBUS_SESSION_BUS_ADDRESS


一年もたって解決しようとしたきっかけは、Desktop Drapesという壁紙自動変更アプリだ。
Desktop Drapes が楽しそうだったので、インストールしてみたのだが、MonoがCPUリソースを食うだけで動かなかった。
そこで、壁紙チェンジャーを思いだし、修正してみることにした。

RESTぶるさん、当分使わせていただきます。
トラックバック初めてするので、変だったらお知らせください。

あれ、トラックバックできてない?