ubuntu 14.04
の通知サービスが変更されました .
org.freedesktop.Notifications.service
のように呼ばれるようになりました
Notification On Screen Display
の詳細については、こちらをご覧ください。 可能性。
また、次のコマンド ラインを使用して独自のメッセージを送信することもできます
<ブロック引用>[email protected] ~$ notify-send 「メッセージ本文」
udev
によって起動されるスクリプトを更新するだけです
notify-send
の実行に関連する問題を回避するには ルートとしてコマンドを実行してください。
通常のユーザーとして実行してみてください。つまり、
su <YOURUSER> -c 'notify-send “Text of message”'
Fabio Aのソリューションを試しました。しかし、私の Arch Linux インストールでは一貫して動作していないことに気付きました。問題は who
でした tty1 セッションのポート番号が表示されませんでした:
$ who
john tty1 2021-03-21 09:02
exec startx
経由で i3 を実行しています 私のArchインストールで。一方、 who
の出力が Ubuntu デスクトップ インストールでは、完全に異なって見えました。ここでは、表示番号が表示されます:
$ who
john :0 2021-03-21 09:49 (:0)
だから私は who
を取り除くための別の解決策を探していました 指図。 ps aux
であることがわかりました 表示番号とユーザー名の両方を含むこの便利なエントリが含まれています:
$ ps aux | grep xinit
john 785 763 0 19:14 tty1 S+ 0:00 xinit /home/john/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.gGcqw2rJXG
これは私が書いた新しいスクリプトです:
#/bin/bash
xinit_pid=$(pgrep xinit)
if [ -n "xinit_pid" ]; then
xinit_ps=$(ps --no-headers -f $xinit_pid | head -n 1)
display=$(echo "$xinit_ps" | grep -Po " :[0-9]+ " | tr -d " ")
user=$(echo "$xinit_ps" | cut -d " " -f 1)
uid=$(id -u $user)
echo "Display environment: $display $user $uid"
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "[email protected]"
else
echo "Warning: Could not find xinit process!"
fi
他のスクリプトは、次の方法でこのスクリプトを呼び出すことができます:
bash /opt/notify-send-helper Title Message -t 5000
補足:dunstify
を使用しています notify-send
の代わりに . dunstify
ID を通知に割り当てることができるという利点があります。同じ ID の最新の通知のみが表示されます。
編集:私はプロセス「Xorg」を照会していました。しかし、不思議なことに、あるマシンでこのプロセスがルートとして実行されていることに気付きました。代わりに「xinit」プロセスに切り替えましたが、これはまったく同じように機能しますが、通常のユーザーによって常に実行されているようです.
root として実行されているバックグラウンド スクリプトからデスクトップ通知を送信するには
(X_user と X_userid をそれぞれ X を実行しているユーザーとユーザー ID に置き換えます):
sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 'This is an example notification.'
これは https://wiki.archlinux.org/index.php/Desktop_notifications から取得しました
tomy の回答と hongo の別の質問への回答を組み合わせると、問題がエレガントに解決されます。
function notify-send() {
#Detect the name of the display in use
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
#Detect the user using such display
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)
#Detect the id of the user
local uid=$(id -u $user)
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "[email protected]"
}
この関数は root
として実行されるスクリプトでそのまま使用できます notify-send
のドロップイン置換として コマンド。