org.freedesktop.Notifications
優先度の高いイベントが記録されるたびに、dbusターゲットを介してデスクトップ通知を送信するシステムサービスを作成しています。これを行うには、journalctl
rootとして実行し、Rustプログラム(journalctl
プログラム内のサブルーチンと呼ばれる)のすべての出力を処理します。これは、次のようにおおよその計算が可能です。
sudo journalctl -focat -p3 -Snow | xargs -I{} -d '\n' notify-send {}
すべてのログにアクセスするにはrootとして実行する必要がありますが、システムサービスとして作成すると機能しなくなります(端末でjournalctl
実行しても機能しません)。sudo
私の(短縮された).service
ファイルは次のとおりです。
[Unit]
Requires=dbus.service
[Service]
WorkingDirectory=~
ExecStart=/usr/bin/auditnotify
Restart=always
PrivateTmp=true
NoNewPrivileges=true
[Install]
Alias=auditnotify
WantedBy=default.target
サービスを確認した後、strace
何が起こっているかを確認しました。zbus
私が使用している通知ボックスの依存関係はnotify-rust
、UIDを取得し、それを使用してセッションバスを取得しようとします。ただし、rootとして実行されているため、UIDは0であり、通知を送信できません。
strace
出力スニペット:
geteuid() = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/run/user/0/bus"}, 18) = -1 ENOENT (No such file or directory)
close(3) = 0
User=gfaster
Group=gfaster
ファイルにおよびを追加すると、この前提が確認され、.service
通知が機能し始めました。しかし、前述のように、ログへのルートアクセスが必要なため、機能しません。
この問題を解決する方法はありますか?このサービスはユーザーセッションの一部として実行できますが、root権限はありますか?ログと対話する2番目のサービスを作成するだけですか?では、その構成はどうなりますか?