ArchLinux フォーラムのこのスレッドには、xscreensaver にクエリを実行して、ユーザーがアイドル状態であった時間の情報を求める短い C プログラムが含まれています。これは、要件に非常に近いようです:
#include <X11/extensions/scrnsaver.h>
#include <stdio.h>
int main(void) {
Display *dpy = XOpenDisplay(NULL);
if (!dpy) {
return(1);
}
XScreenSaverInfo *info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
printf("%u\n", info->idle);
return(0);
}
これを getIdle.c
として保存します でコンパイル
gcc -o getIdle getIdle.c -lXss -lX11
実行ファイルを取得する getIdle
.このプログラムは、「アイドル時間」(ユーザーがマウスで移動/クリックせず、キーボードを使用しない) をミリ秒単位で出力するため、これに基づいて構築された bash スクリプトは次のようになります:
#!/bin/bash
idle=false
idleAfter=3000 # consider idle after 3000 ms
while true; do
idleTimeMillis=$(./getIdle)
echo $idleTimeMillis # just for debug purposes.
if [[ $idle = false && $idleTimeMillis -gt $idleAfter ]] ; then
echo "start idle" # or whatever command(s) you want to run...
idle=true
fi
if [[ $idle = true && $idleTimeMillis -lt $idleAfter ]] ; then
echo "end idle" # same here.
idle=false
fi
sleep 1 # polling interval
done
これにはまだ定期的なポーリングが必要ですが、必要なことはすべて実行されます...
bash の TMOUT は、設定された秒数の後に対話型セッションを終了します。そのメカニズムを使用できます。
該当するトラップを設定するか (テストしていません)、bash-logout-scripts (~/.bash_logout) を使用して、ログアウトをキャプチャすることができます。
これは、その方向への優れたスーパーユーザーの回答です。
これはあなたが要求したものではありませんが、常に batch
があります -command (通常は at
の特別な呼び出し) -command と atd
の使用 -daemon).
batch
負荷平均が特定の制限 (通常は 1.5 ですが、これは atd
の起動時に設定できます) を下回ったときに実行されるコマンドをキューアップできます )。 at
で 特定の時間に実行するのではなく、ジョブをキューに入れることもできます。ジョブは batch
に配信されました そして、負荷平均が低下したときに最初に実行されます (たとえば、午前 2 時以降に負荷平均が 1.5 を下回るとすぐに実行されます)。
残念ながら、バッチ ジョブは最後まで実行され、コンピューターがアイドル状態でなくなっても停止しません。
+++
プログラミングルート(他の回答のように見える)に行かなければならない場合は、 atd
に似たものを作ろうと思います または crond
ログインユーザーおよび/または負荷平均を監視するデーモン。このデーモンは、特定のディレクトリからスクリプト/プログラムを実行し、必要に応じて (シグナルを使用して) 開始/続行または停止することができます。