rootとして実行する必要がある単純な定期的なcronジョブがあります。 cron操作が完了したら、Zenity(または同様のもの)を使用してユーザー1000(またはログインしたユーザーまたはすべてのユーザー)にGUI情報ダイアログボックスを表示したいと思います。
私はシンプルで簡単で迅速な解決策を探しています。この簡単なソリューションの要件を調整します。
これが私が今までいるところです。私のbashスクリプトを手動で実行すると正常に動作しますが、Anacronが実行すると何も起こりません。Gtk-WARNING **: cannot open display
ログに表示されます。 cronが実行された後、ユーザーに私のダイアログを表示したいと思います。
(関連する質問を読んだ後)cronをGUIから切り離す必要があることに気づきました。ユーザー 1000 がログインしていない場合は、次のいずれかのオプションを選択できます。
- 何もしない(単純に保ちたいので許される)
- ユーザーが次回ログインしたときに完了メッセージを含むダイアログボックスを表示する(最適)
- 他の種類の通知を表示する(注:コンピュータはメールサーバーがインストールされていないデスクトップシステムです。)
次の関連質問が見つかりました。 - Think Tank 101 - CC著作権に基づくQ&A共有プラットフォーム Anacronの操作で「Gtk-WARNING**:ディスプレイを開けません」と文句を言います。
shell - zenityの進行のためにプロセスの外部にデータを渡す方法は? - UnixおよびLinuxスタック 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がインストールされているため、引き続き使用できます。)
ベストアンサー1
次のことをあなたのもの~/.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
部分的に)を置いて無期限に実行されます。各スキャンでユーザーのホームディレクトリからif
空でないファイルが呼び出されると、保護は成功します。.messages
成功すると、ファイルの内容はzenityとして読み取られ、削除されます。
吐くのはあまり嬉しくないけどprintf
大丈夫だと思います。
入力した内容は~/.messages
cronからリダイレクトし、ファイルの所有者とグループを適切に変更したことを確認する必要があります。たぶん、次のようなものがあります。
10 * * * * /usr/bin/mything && echo "mything completed" > /home/username/.messages && chown username:groupname /home/username/.messages