การแจ้งเตือนและการแจ้งเตือนภูตไม่ทำงานในการจัดการหน้าต่าง


13

การแจ้งเตือนไม่ทำงานบนตัวจัดการหน้าต่างแบบสแตนด์อโลนของ Linux (Openbox, Awesome WM และเหมือนกัน) ฉันพยายามติดตั้ง notification-daemon และ dunst แต่การส่งด้วยnotify-send "something"ไม่ได้ทำให้หน้าต่างป๊อปอัปปรากฏขึ้น

ฉันพยายามเรียกใช้ polkit-gnome-agent และเรียกใช้ daemons การแจ้งเตือนโดยตรง แต่ก็ไม่ได้ช่วย (ในขณะที่ฉันแก้ไขปัญหาที่คล้ายกันด้วยวิธีนี้ แต่ตอนนี้มันไม่ทำอะไรเลย)

ไม่มีข้อบ่งชี้ข้อผิดพลาดใด ๆ ยกเว้นว่าฉันจะส่งการแจ้งเตือนเล็กน้อยด้วย 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 โปรแกรม C เล็กน้อยก็ไม่แสดงผลใด ๆ (เช่นไม่มีข้อผิดพลาด)

ฉันใช้ Archlinux กับ systemd และ d-bus ฉันสงสัยว่าเป็นปัญหากับ polkit หรือ daemon บางชนิดที่ไม่ทำงานเมื่อเริ่มต้นตัวจัดการหน้าต่าง แต่ไม่มีความคิดฉันสามารถลองอะไรได้บ้างหรือฉันจะได้รับข้อความแสดงข้อผิดพลาด

แก้ไข:ฉันใช้โค้ดตัวอย่างจากที่นั่น: https://wiki.archlinux.org/index.php/Libnotify#Python

Dbus ควรรันเนื่องจาก systemd มีการพึ่งพา ฉันได้libnotifyรับการติดตั้ง - notify-sendมันเป็นแพคเกจที่ให้บริการ daemon การแจ้งเตือนควรเริ่มตามที่ต้องการ (เฉพาะเมื่อเกิดการแจ้งเตือน) โดยทำตามไฟล์เดสก์ท็อป/usr/share/dbus-1/services/org.freedesktop.Notifications.service:

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

ฉันยังพยายามเรียกใช้ daemons โดยตรง (เพิ่งรัน) และลองส่งการแจ้งเตือน ถ้า somenone รู้ว่าฉันจะได้รับข้อมูลเพิ่มเติมได้อย่างไรโปรดอย่าลังเลที่จะแนะนำ

แก้ไข 2:ฉันพยายามเรียกใช้ภูตการแจ้งเตือนด้วย sudo: sudo notification-daemon_name &(ในกรณีของฉันsudo dunst &) และsudo notify-send somethingจากนั้นการแจ้งเตือนทำงาน แต่เมื่อฉันพยายามกระทำใด ๆ ก่อนหน้านี้ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ (ซึ่งเป็นสิ่งสำคัญที่โปรแกรมส่วนใหญ่ส่งการแจ้งเตือนในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ) ไม่มีอะไรแสดงให้เห็น

notification-daemon ปฏิเสธที่จะทำงานเลยโดยไม่มีข้อผิดพลาดหรือคำเตือนใด ๆ

แก้ไข 3:เห็นได้ชัดว่ามันเป็นปัญหาสิทธิ์: ฉันไม่สามารถส่งการแจ้งเตือนโดยไม่ต้องเข้าถึงราก หลังจากรีบูตใหม่ทั้งหมด: sudo notify-send "something"ทำงานได้โดยไม่ต้องเปิด daemons ใด ๆ ด้วยตนเองอย่างไรก็ตามสิ่งที่ฉัน (และโปรแกรมที่เปิดตัว) ควรทำเพื่อให้สามารถส่งการแจ้งเตือนโดยไม่ต้องใช้สิทธิ์รูทเนื่องจากเป็นไปได้ใน Gnome หรือสภาพแวดล้อมบนเดสก์ท็อปอื่น ๆ


1
"พยายามติดตั้ง notification-daemon" หมายถึงอะไร คุณได้ติดตั้งlibnotifyเนื่องจากมีnotify-sendคำสั่ง (ซึ่งเป็นสิ่งที่คุณต้องการ) หรือไม่?
jasonwryan

คุณให้ข้อมูลน้อยเกินไปที่จะตอบคำถามนี้ได้อย่างถูกต้อง จากข้อผิดพลาดเดียวที่คุณให้ฉันสงสัยว่า DBus ไม่ทำงานและดังนั้นจึงไม่มีอะไรสำหรับการแจ้งเตือนส่งเพื่อเชื่อมต่อ หากคุณให้รหัส "การแจ้งเตือนเล็กน้อย" และข้อผิดพลาดที่แน่นอนเราอาจสามารถตอบคำถามได้มากขึ้น
msw

ผมเอารหัสตัวอย่างจากที่นั่น: wiki.archlinux.org/index.php/Libnotify#Python
IBR

ฉันประสบความสำเร็จกับ Dunst ไม่มีข้อความ "การเชื่อมต่อถูกปฏิเสธ" อีกต่อไป
sshow

คำตอบ:


6

ในที่สุดฉันก็แก้ปัญหาด้วยตัวเอง

ฉันจะออกคำแนะนำในสิ่งที่ฉันทำ

ปัญหาประกอบด้วยสองส่วน:

  1. Dbus ไม่สามารถเข้าถึงได้จากภายใน windows manager
  2. ภูตการแจ้งเตือนไม่สามารถรับข้อความจาก dbus

วิธีการแก้ไขปัญหาที่ 1:

ปัญหาที่แท้จริงคือตัวจัดการ windows ของฉันถูกเรียกใช้จาก lxdm ซึ่งด้วยเหตุผลบางอย่างไม่รวมไฟล์ config จาก/etc/X11/xinit/xinitrc.dยกเว้นเซสชัน lxde (ใน 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_SESSION_BUS_ADDRESSตัวแปรซึ่งกำหนดพอร์ต dbus เพื่อใช้สำหรับแอปพลิเคชันต่างๆ 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

วิธีการแก้ไขปัญหาที่สอง:

ในขณะที่ dbus ทำงานและสามารถใช้งานกับโปรแกรมอื่น ๆ ได้ แต่ก็ยังต้องการการแจ้งเตือนเพิ่มเติมเพื่อให้ทำงานได้อย่างถูกต้องดังนั้นฉันจึงจำเป็นต้องเรียกใช้ polkit agent เพราะ Awesome WM ไม่มี ฉันเลือกlxpolkitเพราะฉันมีสภาพแวดล้อม lxde เกือบเต็มแล้ว ในกรณีของฉันเพิ่งเพิ่มไปยัง~/.config/awesome/rc.luaไฟล์ของฉัน: awful.util.spawn_with_shell("dex /etc/xdg/autostart/lxpolkit.desktop")ด้วยเหตุผลบางอย่างที่ไม่มีบรรทัดนี้มันปฏิเสธที่จะเริ่มต้นด้วย lxdm

ฉันคิดว่าตัวแทน gnome polkit ควรทำงานได้ดีเช่นกัน


1
หมายเหตุ: ผู้จัดการการแสดงผลของคุณไม่ควรและไม่ควรทำอะไรกับ.xinitrc/ ฉันลืมสิ่งที่เรียกว่ารสชาติอื่น ๆ ไฟล์เหล่านั้นจะเท่ากัน (ไฟล์ใดไฟล์หนึ่งที่ใช้จะแตกต่างกันไปตามรุ่น distro) และจะใช้เมื่อคุณเรียกใช้startxหรือxinitจากคอนโซล อาจเป็นสาเหตุที่ไฟล์ระบบได้รับการโหลดเป็นเพราะมันเกิดขึ้นใน LXDE ไม่ใช่ LXDM
strugee

ขอบคุณสำหรับการชี้แจง ดูเหมือนว่าฉันต้องทำการกำหนดค่า Aditional โหลดตัวเอง
IBr

ใช่วิธีที่คุณควรทำนั้นขึ้นอยู่กับสภาพแวดล้อมเดสก์ทอป / wm
strugee

โดยทั่วไปสิ่งที่คุณต้องทำ.xinitrcคือเริ่ม daemons พื้นหลังใด ๆ ที่จะไม่เปิดใช้งานในภายหลัง (คุณจะทำเช่นนี้หากคุณไม่ได้gnome-sessionทำเช่นนั้นให้คุณ) จากนั้นในบรรทัดสุดท้ายexecสิ่งใดก็ตามที่คุณใช้กับสภาพแวดล้อม WM / เดสก์ท็อป .
strugee

0

นี่ไม่ใช่คำตอบเพียงแค่คำอธิบายที่ชัดเจนเพื่อช่วยสร้างคำถามต่อไป

ขอบคุณสำหรับการเพิ่มรายละเอียดพิเศษ คุณอาจมีปัญหาสิทธิ์ แต่น่าจะเป็นสิทธิ์ที่จำเป็นในการเชื่อมต่อกับซ็อกเก็ตโดเมน 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 มากกว่าที่ฉันเคยคิดว่าเป็นคุณสมบัติที่เรียบง่ายอย่างเหลือเชื่อ ฉันสงสัยว่าไฟล์การกำหนดค่าบางอย่างใน zillion หรือมากกว่านั้นที่ตั้งค่า GTK แต่ฉันรู้ว่ามันไม่ได้มีประโยชน์อะไร


แน่นอนฉันได้รับconnect(4, {sa_family=AF_LOCAL, sun_path=@"/tmp/dbus-WC3XySChb5"}, 23) = -1 ECONNREFUSED (Connection refused) connect(4, {sa_family=AF_LOCAL, sun_path=@"/tmp/dbus-b3oei13hP2"}, 23) = -1 ECONNREFUSED (Connection refused)
IBR

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.