ルートとして実行する必要がある単純な定期的なcronタスクがあります。 Zenity(または同様のもの)を使用して、cronタスクの終了時にユーザー1000(またはログインしたユーザーまたはすべてのユーザー)にGUI情報ダイアログを表示したいと思います。
シンプル、簡単、迅速な解決策を探しています。このような単純なソリューションの要件に適応します。
これが私が今のところいるところです。私のbashスクリプトは手動で実行すると正常に機能しますが、Anacronが実行しても何も起こらず、ログにGtk-WARNING **: cannot open display
が表示されます。 cronで実行した後、ダイアログがユーザーに表示されることを期待していました。
(関連する質問を読んだ後)cronをGUIから切り離す必要があることに気付きました。ユーザー1000がログインしていない場合は、次のいずれかのオプションを選択できます。
私はこれらの関連する質問を見つけました: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をインストールしているので、引き続き使用できます。)
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
私のシステムは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"という行を含めるようにスクリプトを編集したことに注意してください。それが機能する必要があります。
~/.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
これまでに見つけたすべてのレポートは次のとおりです。
これは現在私のために働いており、私は今のところ問題を見ていません:
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コマンドを使用すると、コマンドラインから通知デーモンを介してデスクトップ通知をユーザーに送信できます。これは、デスクトップユーザーにイベントについて通知したり、ユーザーの邪魔をせずに何らかの形式の情報を表示したりするのに役立ちます。次のパッケージをインストールする必要があります。
$ Sudo apt-get install libnotify-bin
この例では、コマンドラインから簡単なデスクトップ通知を送信し、次のように入力します。
notify-send "rsnapshot done :)"
しかし、解決策を探す過程で、絶対に好きなものも見つけました!すべてのスクリプトでZenityへのすべての呼び出しを削除し、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を使用します。
シェルスクリプトまたはコマンドラインからグラフィカルダイアログを表示する-GoogleProject Hosting http://code.google.com/p/yad/
Yad(さらに別のダイアログ)は、カスタムボタン、追加のダイアログ、通知アイコンのポップアップメニューなど、多くの改良が加えられたZenityのフォークです。
このフォークを作る主な理由は2つあります。 1つ目は、libgladeやgnome-canvasなどの非推奨のライブラリへの依存関係を削除することです。そして2つ目-私にとって、Zenityは放棄されたプロジェクトのように見えます。そのChangeLogは、長い間「バージョンを...にバンプ」と「翻訳を更新」だけで構成されていますが、開発者/メンテナが無視する多くの興味深いアイデアがGNOMEBugzillaにありました。
Don_crisstiが言及しているように、このunix.stackexchange.comのソリューションはおそらく関連性があります。