crontabでxpropを実行する:「ディスプレイを開くことができません」

crontabでxpropを実行する:「ディスプレイを開くことができません」

私はちょうどうまく動作するBashスクリプトを作成しましたxprop(通常のユーザーとrootとして実行)。

#!/bin/bash
# time tracking BASH script

# current time and date
current_date=$(date --rfc-3339='seconds')

# active window id
window_id=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut --fields 2)

# active window class
wm_class=$(xprop '\t$0\n' -id $window_id WM_CLASS | cut --fields 2)

# active window name
wm_name=$(xprop '\t$0\n' -id $window_id _NET_WM_NAME | cut --fields 2)

echo '"'$current_date'", '$wm_class', '$wm_name

出力は次のとおりです(通常のユーザーとrootとして実行)。

nelson@triplecero:~$ bash-scripts/time-tracking.sh
"2019-10-16 23:28:41-04:00", "konsole", "nelson@triplecero: ~ — Konsole"

通常のユーザーがスクリプトを呼び出しましたが、crontab期待どおりに機能しません。エラーメッセージがログに記録されます。"xprop: unable to open display ''"これは、xprop(およびすべてのGUIプログラム)が現在のセッションで実行されていないときに表示される一般的なエラーメッセージです。実はそうではありません。xpropこれは、ルート(および他の人のプログラム)で実行できるためです。

crontab(一般ユーザー用)は次のとおりです。

# m h  dom mon dow   command
  * *    *   *   *   /home/nelson/bash-scripts/time-tracking.sh >> /home/nelson/log/time-tracking.log 2>&1
  * *    *   *   *   window_id=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut --fields 2) 2>&1; echo $window_id >> /home/nelson/log/test.log 2>&1
 

最初の行を実行すると、次のエラーメッセージが表示されますtime-tracking.log

xprop:  unable to open display ''
xprop:  unable to open display ''
xprop:  unable to open display ''
"2019-10-16 23:21:01-04:00", ,

2番目は空行を作成します。test.log

cron正しい出力ではなく、これらのエラーメッセージが表示されるのに何が間違っていますか?

答え1

$DISPLAY環境変数がありません。これは、GUIセッションを初期化する最初のプロセスによって確立され、すべての子プロセスによって継承されます。ローカルX11セッションの場合、この値は通常:0.

この$DISPLAY変数は、X11アプリケーションにXサーバーに接続する方法を示します。この値は、:0にあるローカルUnixソケットを使用するように指示します/tmp/.X11-unix/X0。初期接続後、Direct Rendering Infrastructure(DRI)などの高性能アクセス方法を有効にできます。

CronジョブはGUIセッションとは無関係に実行する必要があるため、自動的に変数を取得しません$DISPLAY。ジョブ所有者が現在ログインしていない場合はどうなりますか? cronジョブが他の人のX11セッションにアクセスできる場合、ユーザーはお互いを監視でき、これは完全に許容できません。

$XAUTHORITY使用しているディストリビューションによっては、環境変数を設定する必要があります。これがなければ、すべてのX11ツールとアプリケーションはX11セッションCookieを持っていると仮定しますが$HOME/.Xauthority、たとえばDebian 10は$TMP各ユーザーにプライベートディレクトリを提供するため、DISPLAYに設定されます$TMP/tmp/user/<user's UID number>$XAUTHORITY$TMP/xauth-<user's UID number>-_0:0

正しいX11セッションCookieにアクセスできない場合、X11サーバーはrootへの要求にも応答しません。 GUIプログラムは/ sessionに渡され、通常のユーザーとしてログインしてからrootを使用するか、rootになるとsu実行できますsudo。これは通常、デフォルトで発生するように設定されます。$DISPLAY$XAUTHORITYsusudo

関連情報