web-dev-qa-db-ja.com

cronでnotify-sendを使用する

KDE/Awesome WMでArch Linuxを使用しています。 notify-sendcronで動作させようとしています。

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に適した通知システムが他にもありますか?

34
justsomeone

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

これが 同じメカニズムを使用する答えです

32
Marco

Crontab自体に変数を設定する必要があります。

DISPLAY=:0.0
XAUTHORITY=/home/matrix/.Xauthority

# m h  dom mon dow   command 
* * * * *  /usr/bin/notify-send "hello"

Sudoは不要です。少なくとも私のシステムでは不要です。

16
terdon

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"
8
Graeme

このワンライナーは、マンジャロでクロニーと一緒に私のために働きました:

# 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

3
PJ Brunet

Ubuntu 18.04でi3を使用しています。これを解決する私の方法は:

* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"

2
Mr. Goferito

これは、Ubuntu Trustyのcronjobで通知送信を機能させるのに十分です。

#!/bin/bash
export DISPLAY=$(who -u | awk  '/\s:[0-9]\s/ {print $2}')

Cronjobを実行しているユーザーのDISPLAYをエクスポートするだけです。 XAUTHORITYDBUS_SESSION_BUS_ADDRESSを設定しなくても動作します。

1
blujay

スクリプトを作成することもできます。

#!/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"

少なくとも私にとってはそうです。それはすべて環境設定に依存しているようです。

1
user1112789

Linuxで快適にインストールできるPythonパッケージの場合、私は notify-send-headless プログラムをリリースしました。これは私にとってうまく機能しています。/procを検索して必要なユーザー名と環境変数を使用して、これらの変数を指定してnotify-sendを実行します(必要に応じて、Sudoを使用して必要なユーザーに切り替えます)。

1
xolox

その価値について...

これを機能させるには、Debian Jessieで次のすべてを使用する必要がありました...

export DISPLAY=:0.0
export HOME=/home/$user
source "$HOME/.dbus/session-bus/*-0"

これらのいずれかを除外すると、機能しなくなりました。

0
BenJ

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
0
intika

私はこのスクリプトを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を使用しているため、問題が発生している可能性があります。

0
cirrus