KDE/Awesome WMでArch Linuxを使用しています。 notify-send
をcron
で動作させようとしています。
DISPLAY
/XAUTHORITY
変数を設定し、notify-send
を "Sudo -u"で実行してみましたが、すべて結果がありませんでした。
セッションから通知送信をインタラクティブに呼び出して、通知を受け取ることができます。
FWIW、cronジョブは問題なく実行されています。一時ファイルに内容をエコーすることで確認しました。機能しないのは、単に「通知送信」だけです。
コード:
[matrix@morpheus ~]$ crontab -l
* * * * * /home/matrix/scripts/notify.sh
[matrix@morpheus ~]$ cat /home/matrix/scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
echo "testing cron" >/tmp/crontest
Sudo -u matrix /usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
[matrix@morpheus ~]$ cat /tmp/crontest
testing cron
now tested notify-send
[matrix@morpheus ~]$
ご覧のとおり、通知送信の前と後のエコーが機能しました。
また、DISPLAY=:0.0
を設定してみました
更新:私はもう少し検索しました DBUS_SESSION_BUS_ADDRESS を設定する必要があることがわかりました。そして、インタラクティブセッションから取得した値を使用してこれをハードコーディングした後、小さな「hello」メッセージが毎分画面にポップアップし始めました!
しかし、問題は、この変数はその投稿ごとに永続的ではないため、そこで提案されている名前付きパイプソリューションを試してみることです。
[matrix@morpheus ~]$ cat scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-BouFPQKgqg,guid=64b483d7678f2196e780849752e67d3c
echo "testing cron" >/tmp/crontest
/usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
cron
は通知送信(少なくとも直接ではない)をサポートしていないようですので、cron
に適した通知システムが他にもありますか?
DBUS_SESSION_BUS_ADDRESS
変数を設定する必要があります。デフォルトでは、cronは変数にアクセスできません。これを修正するには、次のスクリプトをどこかに置き、ユーザーがログインするときに、たとえばawesomeとwikiに記載されているrun_once
関数を使用して呼び出します。関数が必要以上に呼び出されても害はないので、どのメソッドでも問題ありません。
#!/bin/sh
touch $HOME/.dbus/Xdbus
chmod 600 $HOME/.dbus/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus
exit 0
これにより、必要なDbus環境変数を含むファイルが作成されます。次に、cronによって呼び出されるスクリプトで、スクリプトをソースとして変数をインポートします。
if [ -r "$HOME/.dbus/Xdbus" ]; then
. "$HOME/.dbus/Xdbus"
fi
これが 同じメカニズムを使用する答えです
Crontab自体に変数を設定する必要があります。
DISPLAY=:0.0
XAUTHORITY=/home/matrix/.Xauthority
# m h dom mon dow command
* * * * * /usr/bin/notify-send "hello"
Sudo
は不要です。少なくとも私のシステムでは不要です。
Xセッションに関連する環境変数を取得する最も安全な方法は、Xにログオンしているユーザーのプロセスの環境からそれらを取得することです。 Debianでは私にとって問題であるようです):
X=Xorg # works for the given X command
copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS"
tty=$(ps h -o tty -C $X | head -1)
[ -z "$tty" ] && exit 1
# calling who with LANG empty ensures a consistent date format
who_line=$(LANG= who -u | grep "^[^ ]\+[ ]\+$tty")
x_user=$(echo $who_line | cut -d ' ' -f 1) # the user associated with the tty
pid=$(echo $who_line | cut -d ' ' -f 7) # the user's logon process
for env_name in $copy_envs
do
# if the variable is not set in the process environment, ensure it does not remain exported here
unset "$env_name"
# use the same line as is in the environ file to export the variable
export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null
done
Sudo -u "$x_user" notify-send "hello"
これにより、最初に見つかったXユーザーにメッセージが送信されますが、ループを追加してすべてのユーザーに送信することもできます。
Utmp形式を更新すると、2列目にttyの代わりにwho
がディスプレイを表示するようです。これにより、実際には処理が簡単になりました。以前はコメントの表示が最後に印刷されるだけで、元の回答を信頼するのは安全ではないと判断しました。これが事実である場合、これを試してください:
X=Xorg # works for the given X command
copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS"
# calling who with LANG empty ensures a consistent date format
who_line=$(LANG= who -u | awk '$2 ~ ":[0-9]"')
x_user=$(echo $who_line | cut -d ' ' -f 1) # the user associated with the tty
pid=$(echo $who_line | cut -d ' ' -f 7) # the user's logon process
for env_name in $copy_envs
do
# if the variable is not set in the process environment, ensure it does not remain exported here
unset "$env_name"
# use the same line as is in the environ file to export the variable
export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null
done
Sudo -u "$x_user" notify-send "hello"
このワンライナーは、マンジャロでクロニーと一緒に私のために働きました:
# Note: "1000" would be your user id, the output of... "id -u <username>"
10 * * * * pj DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send 'Hello world!' 'This is an example notification.'
非常に醜いDBUS_blah_blahがないと、まったく機能しません。また、journalctl -xb -u cronie
も役に立ちました。私はまだCronieに慣れていませんが、「crontab」を/etc/cron.d/mycronjobs
として作成しました。そのファイル名が必要かどうか、それがcron.dディレクトリ内のすべてを読み取るだけかどうかはわかりません。
私はここで解決策を見つけました https://wiki.archlinux.org/index.php/Desktop_notifications
Ubuntu 18.04でi3を使用しています。これを解決する私の方法は:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
これは、Ubuntu Trustyのcronjobで通知送信を機能させるのに十分です。
#!/bin/bash
export DISPLAY=$(who -u | awk '/\s:[0-9]\s/ {print $2}')
Cronjobを実行しているユーザーのDISPLAY
をエクスポートするだけです。 XAUTHORITY
やDBUS_SESSION_BUS_ADDRESS
を設定しなくても動作します。
スクリプトを作成することもできます。
#!/usr/bin/env bash
runuser -l [yourusername] -c 'DISPLAY=:0 notify-send "hey there user"'
次に、Sudo
を使用して実行します。ただし、crontab -e
は、それを作成したユーザーですべてのコマンドを実行します。Sudo
なしで呼び出すと、次のように十分です。
#!/usr/bin/env bash
DISPLAY=:0 notify-send "hey there user"
少なくとも私にとってはそうです。それはすべて環境設定に依存しているようです。
Linuxで快適にインストールできるPythonパッケージの場合、私は notify-send-headless プログラムをリリースしました。これは私にとってうまく機能しています。/proc
を検索して必要なユーザー名と環境変数を使用して、これらの変数を指定してnotify-send
を実行します(必要に応じて、Sudo
を使用して必要なユーザーに切り替えます)。
その価値について...
これを機能させるには、Debian Jessieで次のすべてを使用する必要がありました...
export DISPLAY=:0.0
export HOME=/home/$user
source "$HOME/.dbus/session-bus/*-0"
これらのいずれかを除外すると、機能しなくなりました。
sudoを使用:
Sudo -u $currentxuser notify-send $message
ヒント:
このコマンドで現在のxユーザーを取得できます
ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' '
加えて...
currentxuser=$(ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' ')
echo $currentxuser
知っておきたいこと:
ルートの下で実行されているCronはxにアクセスできないため、すべてのGUIコマンドが表示されません。このコマンドを使用して、現在のxユーザーの許可されたxユーザーにルートを追加するのが1つの簡単な解決策です。
xユーザーシェルから
xhost local:root
または
Sudo -u $currentxuser xhost local:root
私はこのスクリプトをcronで使用してMPDを投稿し、毎時間Twitterに再生しています
#!/bin/bash
export DISPLAY=":0.0"
msg=$(mpc current -h 192.168.1.33)
Twitter set "#MPD Server nowplaying $msg : http://cirrus.turtil.net:9001"
#ttytter -status="#MPD Server nowplaying $msg. http://cirrus.turtil.net:9001"
exit
notify-sendを使用した同様のスクリプト
#!/bin/bash
export DISPLAY=":0.0"
notify-send -i ~/.icons/48Arch.png 'OS- Archlinux x86_64 : DWM Window Manager' 'Installed on Sun Apr 21 2013 at 18:17:22'
exit
kDEは独自の通知デーモンIIRCを使用しているため、問題が発生している可能性があります。