Linuxが5分間アイドル状態の場合にコマンドを実行する


16

次のようなコマンドを実行したい

 notify-send 'a'

Linuxマシンが5分間アイドル状態だった場合。

アイドルとは、スクリーンセーバーがアクティブ化されて「アイドル」を定義するのと同じことを意味します。


OK、何を試しましたか?グーグルは何と言いましたか?スクリーンセーバーがこれを検出する方法を見つけようとしましたか?ここに質問を投稿する前に時間をかけて検索し、良い質問の仕方を読んでください。
テルドン

プログラムを見つけましたxautolockが、例はありません

回答:


20

xprintidleXアイドル時間を見つけるために呼び出されるプログラムを使用します。これはスクリーンセーバーと同じデータソースを使用していると強く推測しています。xprintidleアップストリームはもうないようですが、Debianパッケージは健在です。

これは非常に単純なアプリケーションです。最後のXインタラクションからのミリ秒数を返します。

$ sleep 1 && xprintidle
940
$ sleep 5 && xprintidle
4916
$ sleep 10 && xprintidle
9932

(注:基礎となるシステムにより、「実際の」アイドル時間よりもわずかに低い値が一貫してミリ秒単位で表示されます)。

これを使用して、たとえば次の方法で、アイドル時間の5分後に特定のシーケンスを実行するスクリプトを作成できます。

#!/bin/sh

# Wanted trigger timeout in milliseconds.
IDLE_TIME=$((5*60*1000))

# Sequence to execute when timeout triggers.
trigger_cmd() {
    echo "Triggered action $(date)"
}

sleep_time=$IDLE_TIME
triggered=false

# ceil() instead of floor()
while sleep $(((sleep_time+999)/1000)); do
    idle=$(xprintidle)
    if [ $idle -ge $IDLE_TIME ]; then
        if ! $triggered; then
            trigger_cmd
            triggered=true
            sleep_time=$IDLE_TIME
        fi
    else
        triggered=false
        # Give 100 ms buffer to avoid frantic loops shortly before triggers.
        sleep_time=$((IDLE_TIME-idle+100))
    fi
done

100ミリ秒のオフセットは、xprintidleこのように実行された場合に「実際の」アイドル時間よりもわずかに短い時間を常に返す前述の癖のためです。このオフセットなしで機能し、10分の1秒までより正確になりますがxprintidle、間隔が終了する前の最後のミリ秒の間、必死にチェックをトリガーします。決してパフォーマンスを独り占めするわけではありませんが、私はその優雅さに気付かないでしょう。

Perlスクリプト(irssiプラグイン)でかなり長い間、同様のアプローチを使用しましたが、上記は記述されたばかりであり、作成中のいくつかの試行実行を除いて実際にはテストされていません。

X内のターミナルで実行して試してください。テストのためにタイムアウトをたとえば5000ミリ秒に設定し、そのset -xすぐ下#!/bin/shに追加して、有益な出力を取得して動作を確認することをお勧めします。


5

xssstateはそのような目的で使用します。DebianUbuntu、または上流のsuckless-toolsパッケージで利用可能です。

その後、次のシェルスクリプトを使用できます。

#!/bin/sh

if [ $# -lt 2 ];
then
    printf "usage: %s minutes command\n" "$(basename $0)" 2>&1
    exit 1
fi

timeout=$(($1*60*1000))
shift
cmd="$@"
triggered=false

while true
do
    tosleep=$(((timeout - $(xssstate -i)) / 1000))
    if [ $tosleep -le 0 ];
    then
        $triggered || $cmd
        triggered=true
    else
        triggered=false
        sleep $tosleep
    fi
done

1

コンパイルできるCアプリケーションを見つけました。

$ more xidle.c 
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/scrnsaver.h>

/* Report amount of X server idle time. */
/* Build with- */
/* cc xidle.c -o xidle -lX11 -lXext -lXss */


int main(int argc, char *argv[])
{
    Display *display;
    int event_base, error_base;
    XScreenSaverInfo info;
    float seconds;

    display = XOpenDisplay("");

    if (XScreenSaverQueryExtension(display, &event_base, &error_base)) {
    XScreenSaverQueryInfo(display, DefaultRootWindow(display), &info);

    seconds = (float)info.idle/1000.0f;
    printf("%f\n",seconds);
    return(0);
    }
    else {
    fprintf(stderr,"Error: XScreenSaver Extension not present\n");
    return(1);
    }
}

ビルドするにはいくつかのライブラリが必要です。Fedora 19システムでは、次のライブラリが必要でした。

$ rpm -qf /lib64/libX11.so.6 /lib64/libXext.so.6 /lib64/libXss.so.1
libX11-1.6.0-1.fc19.x86_64
libXext-1.3.2-1.fc19.x86_64
libXScrnSaver-1.2.2-5.fc19.x86_64

これらがインストールされたら、上記のようにコンパイルしました:

$ gcc xidle.c -o xidle -lX11 -lXext -lXss

次のように実行すると、Xがアイドル時間として検出している秒数を報告できることがわかります。

$ while [ 1 ]; do ./xidle ; sleep 2;done
0.005000
1.948000
3.954000
5.959000
7.965000
0.073000   <--- moved the mouse here which resets it
0.035000

この実行可能ファイルを使用すると、次のようなことができるスクリプトを作成し、によって報告されるアイドル時間を監視できますxidle

$ while [ 1 ]; do idle=$(./xidle); 
    [ $( echo "$idle > 5" | bc ) -eq 0 ] && echo "still < 5" || echo "now > 5"; 
    sleep 2;
done
still < 5
still < 5
still < 5
now > 5
now > 5
still < 5
still < 5
still < 5

上記番組still < 5のアイドル時間の5秒まではそれが言って開始する時点で、経過now > 55+秒が経過したことを、どの手段を。

注:notify-send 'a'上記の例に組み込むことができます。

参照資料


-1

bsd ports(packages collection)には、これを行うことができるプログラムがあります:
http ://man.openbsd.org/OpenBSD-current/man1/xidle.1それは、
例えばここから入手できます:http :
//distcache.freebsd.org/local- distfiles / novel / xidle-26052015.tar.bz2

のようなビルド:

 # apt-get install libxss-dev # for include/X11/extensions/scrnsaver.h
 # gcc -o /usr/local/bin/xidle xidle.c -lX11 -lXss

-programはexecv()に渡されるため、バイナリへのフルパスを含める必要があることに注意してください。

$ xidle -timeout 120 -program "/usr/bin/xlock -mode pyro"  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.