web-dev-qa-db-ja.com

ルートcronタスクが完了した後に(zenity / GUI)ダイアログをユーザーに表示する方法

ルートとして実行する必要がある単純な定期的なcronタスクがあります。 Zenity(または同様のもの)を使用して、cronタスクの終了時にユーザー1000(またはログインしたユーザーまたはすべてのユーザー)にGUI情報ダイアログを表示したいと思います。

シンプル、簡単、迅速な解決策を探しています。このような単純なソリューションの要件に適応します。

これが私が今のところいるところです。私のbashスクリプトは手動で実行すると正常に機能しますが、Anacronが実行しても何も起こらず、ログにGtk-WARNING **: cannot open displayが表示されます。 cronで実行した後、ダイアログがユーザーに表示されることを期待していました。

(関連する質問を読んだ後)cronをGUIから切り離す必要があることに気付きました。ユーザー1000がログインしていない場合は、次のいずれかのオプションを選択できます。

  1. 何もしません(単純にしておきたいので、おそらく許容できます)
  2. ユーザーが次回ログインしたときに、完了メッセージを含むダイアログを表示します(最適)
  3. 他の種類の通知を表示します(注:コンピューターはメールサーバーがインストールされていないデスクトップシステムです)

私はこれらの関連する質問を見つけました:x11-Anacronジョブが「Gtk-警告**:ディスプレイを開けません」-Unix&Linux Stack Exchange Anacronジョブが「Gtk-警告**:ディスプレイを開けません」と文句を言います

シェル-天頂の進歩のためにプロセスの外にデータを渡す方法は? --UnixおよびLinuxStack Exchange zenityの進行のためにプロセス外にデータを渡す方法は?

サンプルコード(本質的に私のものと同じ他の質問から):

#!/bin/bash
# Backs up the local filesystem on the external HDD

sleep 60

DISPLAY=:0.0

zenity --question --text "Do you want to backup? Be sure to turn on the HDD."
if [ $? -ne 0 ]
    then exit 1
fi

*Do backup stuff here*

エラー:

(zenity:9917): Gtk-WARNING **: cannot open display: 
run-parts: /etc/cron.daily/backup-on-external exited with return code 1

(私はKubuntuを実行しているので、KDEソリューションはZenityよりも優れていますが、すでにZenityをインストールしているので、引き続き使用できます。)

3
MountainX

Mel Boyceの回答に基づいて、これが私のために働いたものです。これはKDEベースです。しかし、Zenityでもテストしたところ、同じアプローチが機能します。これは基本的にMelBoyceが推奨したものと同じですが、私のために機能させるためにいくつかの調整が加えられています。たとえば、updateNotification.txtファイルは削除しません。そして、私はprintfを使用しません。

アップデータスクリプトには次のものが含まれます。

DATE_STAMP=` date`
echo "\t***The software has been updated to version ${LATEST} on ${DATE_STAMP}***"
echo "The software has been updated to version ${LATEST} on ${DATE_STAMP}. Please close and reopen the program if it is current running. If you have any issues or questions, please write us at [email protected]. Thank you." > /home/$USERN/.updateNotification.txt

次に、/ home/$ USERN/.kde/Autostart /updateNotificationChecker.shで実行されているスクリプトがあります。

#!/bin/bash
while true; do
    if [[ -s ~/.updateNotification.txt ]]; then
                read MSGFE < ~/.updateNotification.txt 
                kdialog --title 'The software has been updated' --msgbox "$MSGFE"
                cat /dev/null > ~/.updateNotification.txt
    fi
    sleep 300
done
exit 0
0
MountainX

私のシステムはubuntu13.04です。 anacrontabを介してあなたと同様のスクリプトを実行しましたが、機能します。これを試して ..

Crontabを設定します。

$ cat /path/crontabfile
Shell=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

*   *   *   *   *   /bin/bash /path/anacron-tst/s1.sh

別の方法:anacrontabを設定します。

$ cat /etc/anacrontab
### original
.. ,, ..
Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1   5   cron.daily  run-parts --report /etc/cron.daily
7   10  cron.weekly run-parts --report /etc/cron.weekly
@monthly    15  cron.monthly    run-parts --report /etc/cron.monthly
### end-original

### my custom lines ..
Shell=/bin/bash
HOME=/home/me
LOGNAME=me

1   2   me1 /bin/bash /path/anacron-tst/s1.sh

スクリプト内..

$ cat /path/anacron-tst/s1.sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

export DISPLAY=:0.0
export XAUTHORITY=/home/me/.Xauthority

zenity --question --text "Backup time .. is HDD connected?"

if [ $? -ne 0 ]; then
    echo "No confirmation .. quiting"
    exit 1
else
    echo "Will attempt backup now .."
fi

これはman5anacrontabから..

.. lines can be of three kinds:  job-description lines, environment assignments, or empty lines.

Environment assignment lines are of the form: VAR = VALUE
.. ,, ..
The assignment takes effect from the next line to the end of the  file,  or
to the next assignment of the same variable.

これは、root用にインストールされたcrontabで機能しています。 "export XAUTHORITY =/home/me/.Xauthority"という行を含めるようにスクリプトを編集したことに注意してください。それが機能する必要があります。

1
Randy Skretka

~/.xinitrc(またはログインマネージャーを使用している場合は~/.xsession)に次のようなものを追加してみてください。

while true; do
    if [[ -a ~/.messages ]]; then
        zenity --info --text="$(printf "%q" $(cat ~/.messages))"
        rm ~/.messages
    fi
    sleep 10
done &

私はこれを持っていないので、これをzenityでテストしていません。また、.xsessionは期待どおりに機能すると思います。ログインマネージャーを使用したことはありません。

while/doneブロックは、チェックの間に10秒の遅延(sleep 10部分)で無期限に実行されます。チェックがあるたびに、ユーザーのホームディレクトリに.messagesという空でないファイルがある場合、ifガードは成功します。成功すると、ファイルの内容がzenityに読み込まれ、ファイルが削除されます。

printf嘔吐にはわくわくしませんが、大丈夫なはずです。

~/.messagesに入れられるコンテンツは、cronからリダイレクトされる必要があり、ファイルの所有者とグループを適切に変更する必要があります。おそらく次のようなものです:

10 * * * * /usr/bin/mything && echo "mything completed" > /home/username/.messages && chown username:groupname /home/username/.messages
1
Mel Boyce

これまでに見つけたすべてのレポートは次のとおりです。

Ask Ubuntuのこのソリューション

これは現在私のために働いており、私は今のところ問題を見ていません:

        ACTIVE=$(ck-list-sessions | awk -F' = ' '
            function f(){if(A=="TRUE"){P=U"\t"D;gsub("'"'"'","",P);print P}}
            $1=="\tunix-user"{U=$2} 
            $1=="\tx11-display"{D=$2} 
            $1=="\tactive"{A=$2} 
            END{f()} /^[^\t]/{f()}
        ')
        USERID=${ACTIVE%    *} # tab
        USERNAME=$(getent passwd $USERID|cut -f1 -d':')
        DISPLAY=${ACTIVE#*  } # tab

        DISPLAY="$DISPLAY" su $USERNAME -c "zenity --info --title='My Title' --text='My text. Notice the single quotes.'"

しかし、私はnotify-sendコマンド(言及 ここ )をテストしており、私の状況にはさらに適切であるように思われます。

残念ながら、KDEには通知がすぐに非表示になり、そのタイムアウトを無効にする方法が見つからないという欠点があります(-t 0は機能しませんでした)。私の現在のユースケースでは、ボタンをクリックして閉じる必要のあるダイアログボックスが好きになる傾向があります。とにかく、notify-sendの詳細は次のとおりです。

notify-sendコマンド

Notify-sendコマンドを使用すると、コマンドラインから通知デーモンを介してデスクトップ通知をユーザーに送信できます。これは、デスクトップユーザーにイベントについて通知したり、ユーザーの邪魔をせずに何らかの形式の情報を表示したりするのに役立ちます。次のパッケージをインストールする必要があります。

$ Sudo apt-get install libnotify-bin

この例では、コマンドラインから簡単なデスクトップ通知を送信し、次のように入力します。

notify-send "rsnapshot done :)"

しかし、解決策を探す過程で、絶対に好きなものも見つけました!すべてのスクリプトでZenityへのすべての呼び出しを削除し、easybashguiに置き換えます。

easybashgui

http://sites.google.com/site/easybashgui/

EasyBashGUIは、* BSDおよびGNU/Linux用のBash関数ライブラリであり、yad、gtkdialog、kdialog、zenity、Xdialog、(c)dialog、whiptail、またはbashビルトインを使用して、KDEまたはGNOMEが実行されているかどうかに応じて、単純なGUI関数を提供することを目的としています。/Gtkdialog/Xdialogがインストールされているかどうか、そして最終的にはXサーバーが実行されているかどうか。

また、将来的にZenityに取って代わるYadも見つけました。 easybashguiは、Zenity、yad、gtkdialog、kdialog、Xdialog、(c)dialog、whiptail、またはbashビルトインを使用/呼び出すことができます。そのため、Zenityを段階的に廃止し、必要に応じてyadを使用します。

yad

シェルスクリプトまたはコマンドラインからグラフィカルダイアログを表示する-GoogleProject Hosting http://code.google.com/p/yad/

Yad(さらに別のダイアログ)は、カスタムボタン、追加のダイアログ、通知アイコンのポップアップメニューなど、多くの改良が加えられたZenityのフォークです。

このフォークを作る主な理由は2つあります。 1つ目は、libgladeやgnome-canvasなどの非推奨のライブラリへの依存関係を削除することです。そして2つ目-私にとって、Zenityは放棄されたプロジェクトのように見えます。そのChangeLogは、長い間「バージョンを...にバンプ」と「翻訳を更新」だけで構成されていますが、開発者/メンテナが無視する多くの興味深いアイデアがGNOMEBugzillaにありました。

メモ

Don_crisstiが言及しているように、このunix.stackexchange.comのソリューションはおそらく関連性があります。

リモートXディスプレイでウィンドウを開く(「ディスプレイを開けない」理由)?

0
MountainX