システムがアイドル状態で再アクティブ化されたときにコマンドを実行します。

システムがアイドル状態で再アクティブ化されたときにコマンドを実行します。

ユーザーが非アクティブ(システムアイドル)状態になったら、コマンドを実行したいと思います。たとえば、

echo "You started to be inactive."

また、ユーザーが再びアクティブにした場合(システムはもはやアイドル状態ではありません):

echo "You started to be active, again."

これにはシェルスクリプトが必要です。タイマー/間隔なしでこれは可能ですか?たぶんシステムイベントですか?

ベストアンサー1

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

それでも定期的なポーリングが必要ですが、必要なすべての操作を実行します。

おすすめ記事