GNU/Linux >> Linux の 問題 >  >> Linux

システムがアイドル状態で、再びアクティブになったときにコマンドを実行する

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 ログインユーザーおよび/または負荷平均を監視するデーモン。このデーモンは、特定のディレクトリからスクリプト/プログラムを実行し、必要に応じて (シグナルを使用して) 開始/続行または停止することができます。


Linux
  1. timedatectlコマンドを使用してRHEL7Linuxシステムの日時を変更する

  2. Linuxコマンドでの(!)記号または演算子の10の驚くべき不思議な使用法

  3. システム管理者(root)としてコマンドを実行する方法は?

  1. ディレクトリの内容が更新されたときにコマンドを実行するにはどうすればよいですか?

  2. コマンドCat/proc / cpuinfoを実行するとどうなりますか?

  3. 複数のホストにSSHで接続し、コマンドを実行しますか?

  1. Debian 10 で最初の Qt プログラムを作成して実行する方法

  2. 7 システムの日付時刻を表示および設定するLinux Dateコマンドの例

  3. Linux でのスケジューリング:コンピューターがアイドル状態のときにタスクを実行 (=ユーザー入力なし)