私はちょうどうまく動作する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
$XAUTHORITY
su
sudo