なぜ仕事でdzen2経由で電話しないのですか?

なぜ仕事でdzen2経由で電話しないのですか?

dzen2通知ユーティリティです。このコマンドは画面に「こんにちは」通知を表示します。

echo Hi | dzen2 -p

Debian存在する将来のイベントをスケジュールするユーティリティです。このコマンドは、1分後にユーザーディレクトリに「foo」ファイルを表示します。

echo "touch ~/foo" | at now + 1 minute

それでは、dzen2このコマンドについて1分後に通知が表示されないのはなぜですか?

echo "echo Hi | dzen2 -p" | at now + 1 minute

何時間も調べてみましたが、これがうまくいかない理由が見つからないようです!私はそれが呼び出されるシェルに関連していると直感していますが、なぜ失敗するのかわかりません。対位法の例として、次のコマンドはうまく機能します。

echo "notify-send Hi" | at now + 1 minute

答え1

このタスクを構成するプログラムは、次の場所にatあります。atd悪魔)プロセス、実行中のシェルのプロセスではありませんat。したがって、現在シェルの環境を継承しません。システムはat環境(作業ディレクトリとより曖昧な項目を含む)をコピーする準備をしますが、いくつかの変数を省略します。

特に、このDISPLAY変数はatジョブにコピーされません。この変数は、すべてのXプログラムに接続するモニターを示します。 Xが表示されない場合、dzen2は通知ポップアップの場所を知りません。 AtDISPLAYは通常、端末やグラフィック出力を生成しないバッチジョブに使用されるため、削除されます。

notify-sendXサーバーに接続していないので動作します。DバスX セッションに接続されたデーモンに接続します。

変数を明示的にコピーしてdzen2が機能するようにすることができますDISPLAY

echo "export DISPLAY=$DISPLAY;" 'echo hello | dzen2 -p' | at now + 42 minutes

dzen2では、エラーメッセージが表示されることがあります(標準メッセージはですCan't open display:)。 atジョブによって生成されたすべての出力またはエラーメッセージは、ローカルメールを介して送信されます(正確にはcronジョブに似ています)。ローカルメールを確認してください。

関連情報