cron コマンドでユーザーセッション D-bus にアクセスします。

cron コマンドでユーザーセッション D-bus にアクセスします。

実行している場合、cronコマンドがセッションバスにアクセスできるようにするには何が必要ですか?

systemdに切り替えてから、最近(おそらく1〜2ヶ月前)まで、Debian Stretch(テスト)で私に効果的でした。奇妙なことに、これはPAM構成によって制御されると強く疑われていますが、/etc/pam.d最近の唯一の変更はいくつかのペアが追加pam_selinuxされたことですpam.d/systemd-user

それでは何を探すべきですか?

答え1

DBUS_SESSION_BUS_ADDRESSこれは、環境変数がcron環境に伝播されないためです。

少なくともGnomeでは、バスは「検索可能」ではありません(文書の「自動起動」セクションに記載されているように)。dbus-launch(1)マニュアルページ)ファイルを介して$HOME/.dbus/session-bus。これにより、crontabで実行されているすべてのエントリが$DBUS_SESSION_BUS_ADDRESSD-Busセッションを見つけて接続することができなくなります。

私は参照されている実際のファイルの使用$HOME/.dbusや存在のために過去に動作していたという言葉を受け入れます(通常のような設定)。マニュアルページでは、次のように説明します。/tmp/dbus-$TMPNAM$DBUS_SESSION_BUS_ADDRESSunix:abstract=/tmp/dbus-GkJdpPD4sk,guid=0001e69e075e5e2dbus-cleanup-sockets(1)

Linuxでは、D-Busはデフォルトでメモリにのみ存在し、/ tmpにそのファイルがない「抽象ソケット」を使用するため、このプログラムは本質的に役に立ちません。

ただし、Ubuntuフォーラムの投稿で提案されたアイデアのバリエーションを使用できます。SSH経由で既存のDBUSセッションに接続する、cron環境でローカルマシンの既存のユーザーセッションのセッションD-Busを検索し、それ$DBUS_SESSION_BUS_ADDRESSに応じて設定します。

nautilusここで使用されている技術は、通常実行されているpulseaudioプロセス(たとえば、および)から環境を検索し、そのtrackerdプロセスの1つ以上をアクティブセッションで実行する必要がありますが、より基本的なアプローチをお勧めします。

すべての一般的なデスクトップ環境セッションマネージャ(gnome-sessionlxsessionおよび)は、以前に起動され、より低いPIDを持っていても、その環境にすでにkded4設定されています。したがって、デスクトップ環境に対応するセッションマネージャを使用するのが最も合理的です。$DBUS_SESSION_BUS_ADDRESSdbus-daemon

$HOME/bin/test-crontab-dbus.sh既存のセッションバスへのアクセスをテストするために、内部に次のスクリプトを作成しました。

#!/bin/sh
SESSION_MANAGER=lxsession
OUTFILE=/tmp/${USER}-cron-dbus.txt

export $(cat /proc/$(pgrep "$SESSION_MANAGER" -u "$USER")/environ \
  |egrep -z '^DBUS_SESSION_BUS_ADDRESS=')

date >> $OUTFILE
dbus-send --session --dest=org.freedesktop.DBus \
   / org.freedesktop.DBus.GetId 2>> $OUTFILE
if test "$?" -eq 0; then
    echo "Success contacting session bus!" >> $OUTFILE
fi

上記は、SESSION_MANAGER=lxsessionLXDEで実行されるデフォルトのデスクトップセッション、設定したGnome、およびSESSION_MANAGER=gnome-session使用しているKDEに適用されますSESSION_MANAGER=kded4

crontabのジョブがセッションバスにアクセスできる場合、出力には次のような内容が表示されます。

Fri Dec 18 15:27:02 EST 2015
Success contacting session bus!

それ以外の場合はエラーメッセージが表示されますdbus-send

明らかに、cronタスクを介して実際に実行する必要があるすべてのタスクを含む、セッションバス接続をテストする他の方法を置き換えることができます。

関連情報