web-dev-qa-db-ja.com

通知と通知デーモンがウィンドウマネージャーで機能しない

通知は、Linuxスタンドアロンウィンドウマネージャー(Openbox、Awesome WMなど)では機能しません。 notification-daemonとdunstをインストールしようとしましたが、_notify-send "something"_で送信してもポップアップウィンドウが表示されません。

私はpolkit-gnome-agentを実行して直接通知デーモンを実行しようとしましたが、役に立ちません(以前は同様の問題をこの方法で解決しましたが、今は何もしません)。

Pythonで些細な通知を送信しない限り、エラーの兆候はありません。そうすると、漠然としたエラーメッセージのみが表示されます。File "/usr/lib/python3.3/site-packages/gi/types.py", line 113, in function return info.invoke(*args, **kwargs) gi._glib.GError: Could not connect: Connection refused Trivial Cプログラムは何も出力しません(たとえば、エラーはありません)。

私はsystemdとd-busでArchlinuxを使用していますが、ウィンドウマネージャーの起動時にpolkitまたはなんらかのデーモンが実行されていないことが問題だと思いますが、何を試したらいいのか、どうすればもっと意味のあるエラーメッセージが表示されるのかわかりません。

編集:私はそこからサンプルコードを取得しました: https://wiki.archlinux.org/index.php/Libnotify#Python =

Systemdには依存関係があるため、Dbusが実行されている必要があります。私はlibnotifyをインストールしました-これは_notify-send_を提供するパッケージです。また、通知デーモンは、デスクトップファイル_/usr/share/dbus-1/services/org.freedesktop.Notifications.service_に従って、必要に応じて(通知が到着したときのみ)開始する必要があります。

_[D-BUS Service]
Name=org.freedesktop.Notifications
Exec=/usr/bin/dunst
_

私はデーモンを直接実行(実行のみ)しようとし、通知を送信しようとしました。誰かが私にもっと情報を得る方法を知っているなら、遠慮なく提案してください。

EDIT 2:Sudo:_Sudo notification-daemon_name &_(私の場合は_Sudo dunst &_)および_Sudo notify-send something_で通知デーモンを実行してみました、その後通知が機能します。しかし、特権のないユーザーとしてこれまでのアクションを実行しようとすると(ほとんどのプログラムが特権のないユーザーとして通知を送信することが重要です)、何も表示されません。

_notification-daemon_は、エラーや警告なしでまったく機能しません。

EDIT 3:明らかにアクセス権の問題です:ルートアクセスなしでは通知を送信できません。クリーンリブート後:デーモンを手動で起動しなくても_Sudo notify-send "something"_は機能しますが、Gnomeまたは他の完全なデスクトップ環境で可能であるように、ルート権限なしで通知を送信できるようにするために私(および起動したプログラム)は何をすべきですか?

13
IBr

最後に自分で問題を解決しました。

私がやったことは指示を残します。

問題は2つの部分で構成されています。

  1. Windowsマネージャー内からDbusにアクセスできない
  2. 通知デーモンがdbusからメッセージを取得できません

最初の問題の解決策:

実際の問題は、私のWindowsマネージャーがlxdmから実行されたことです。これは、何らかの理由で、lxdeセッションを除いて_/etc/X11/xinit/xinitrc.d_からの構成ファイルをマージしません(LXDE dbusでは、素晴らしいwmでは機能しません)。このフォルダには、次の内容の_30-dbus_という名前のファイルが存在します。

_#!/bin/bash

# launches a session dbus instance
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] && type dbus-launch >/dev/null; then
  eval $(dbus-launch --sh-syntax --exit-with-session)
fi
_

コードのこの部分では、さまざまなアプリケーションで使用するdbusポートを定義する_$DBUS_SESSION_BUS_ADDRESS_変数を定義します。 _echo $DBUS_SESSION_BUS_ADDRESS_は、dbusセッションが存在するかどうかを確認する単純な健全性チェックとして使用できます(dbusセッションファイルを返す必要があります)。

このフォルダーの構成ファイルは、セッション開始時に単純なシェルスクリプトとマージできます(_.xinitrc_から取得したコード):

_#!/bin/bash

if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi
_

2番目の問題の解決策:

Dbusが実行されており、他のプログラムで使用可能である一方で、通知が適切に機能するためにはさらに多くのアクセス権が必要です。AwesomeWMにはないため、polkitエージェントを実行する必要がありました。 lxpolkitを選択したのは、すでにほぼ完全なlxde環境があったためです。私の場合、_~/.config/awesome/rc.lua_ファイルに追加したばかりです:awful.util.spawn_with_Shell("dex /etc/xdg/autostart/lxpolkit.desktop")、何らかの理由でこの行がないと、デフォルトでlxdmを使用して開始することが拒否されました。

Gnome polkitエージェントも問題なく機能するはずです。

6
IBr

私にとっては、i3wmにnotify-osdとdunstをインストールすることができました。

0
anstue

これは答えではなく、次の質問を生成するのに役立つ大きな説明です。

追加の詳細を追加していただきありがとうございます。おそらくアクセス許可の問題がありますが、残念ながらDBus Unixドメインソケットに接続するために必要なアクセス許可にある可能性があります。

これを非ルートとして実行するには、次のようにします。

$ strace -o /tmp/ns.out notify-send "why will this not connect"
$ grep '^connect' /tmp/ns.out
connect(4, {sa_family=AF_FILE, path=@"/tmp/dbus-6AIOJVWzCC"}, 23) = 0

おそらくあなたはおそらく次のようなものを得るでしょう

connect(…) = -1 ECONNREFUSED  (Connection refused)

どうして?何も思いつきません。通知サブシステムがGNOME開発コミュニティで注目を集めているのは、私がこれまで表面的に単純な機能であるはずだと思っていたことよりも確かです。何千もの設定ファイルがGTKの設定場所にあるのではないかと思いますが、あまり役に立ちません。

0
msw