Jalankan perintah jika Linux diam selama 5 menit

16

Saya ingin menjalankan perintah seperti

 notify-send 'a'

jika mesin Linux saya diam selama 5 menit.

Dengan idle, maksud saya hal yang sama dengan screen saver yang diaktifkan akan digunakan untuk mendefinisikan "idle".

slhck
sumber
Oke, apa yang sudah Anda coba? Apa kata google? Sudahkah Anda mencoba mencari tahu bagaimana screensaver mendeteksi ini? Silakan luangkan waktu untuk mencari sebelum memposting pertanyaan di sini dan baca Bagaimana cara mengajukan pertanyaan yang bagus .
terdon
Saya hanya menemukan sebuah program xautolocktetapi tidak ada contoh

Jawaban:

20

Saya menggunakan program yang dipanggil xprintidleuntuk mencari tahu waktu X idle, yang saya duga menggunakan sumber data yang sama dengan screensaver. xprintidlesepertinya tidak benar-benar memiliki upstream lagi, tetapi paket Debian masih hidup dan sehat.

Ini adalah aplikasi yang sangat sederhana: ia mengembalikan jumlah milidetik sejak interaksi X terakhir:

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

(catatan: karena sistem yang mendasarinya, secara konsisten akan memberikan nilai dalam ms sedikit lebih rendah dari waktu idle "aktual").

Anda dapat menggunakan ini untuk membuat skrip yang menjalankan urutan tertentu setelah lima menit waktu idle melalui mis:

#!/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

Offset 100 ms adalah karena kekhasan yang dicatat sebelumnya yang xprintidleakan selalu mengembalikan waktu yang sedikit lebih rendah daripada waktu idle "aktual" ketika dijalankan seperti ini. Ini akan bekerja tanpa offset ini, dan kemudian akan lebih akurat hingga sepersepuluh detik, tetapi akan memicu xprintidlepemeriksaan dengan panik selama milidetik terakhir sebelum interval berakhir. Bukan kinerja babi dengan cara apa pun, tapi saya akan menemukan bahwa canggung.

Saya telah menggunakan pendekatan yang sama dalam skrip Perl (sebuah plugin irssi) untuk beberapa waktu, tetapi yang di atas hanya ditulis dan belum benar-benar diuji kecuali untuk beberapa percobaan berjalan selama penulisan.

Cobalah dengan menjalankannya di terminal dalam X. Saya sarankan mengatur batas waktu untuk misalnya 5000 ms untuk pengujian, dan menambahkan set -xlangsung di bawah ini #!/bin/shuntuk mendapatkan output informatif untuk melihat cara kerjanya.

Daniel Andersson
sumber
5

Saya menggunakan xssstateuntuk tujuan seperti itu. Ini tersedia dalam suckless-toolspaket di Debian atau Ubuntu , atau hulu .

Kemudian Anda dapat menggunakan skrip shell berikut:

#!/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
Petr Shevtsov
sumber
1

Inilah aplikasi C yang saya temukan yang dapat Anda kompilasi.

$ 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);
    }
}

Perlu beberapa perpustakaan untuk membangun. Pada sistem Fedora 19 saya, saya membutuhkan perpustakaan berikut:

$ 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

Setelah ini diinstal saya mengkompilasi di atas seperti ini:

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

Anda dapat melihat bahwa ia dapat melaporkan jumlah detik yang dideteksi X sebagai waktu idle dengan menjalankannya seperti ini:

$ 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

Dengan menggunakan executable ini, Anda dapat membuat skrip yang dapat melakukan hal seperti ini, memantau waktu idle yang dilaporkan oleh 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

Di atas menunjukkan still < 5hingga 5 detik waktu idle telah berlalu, pada titik mana ia mulai berkata now > 5, yang berarti bahwa 5+ detik telah berlalu.

CATATAN: Anda dapat memasukkan Anda notify-send 'a'ke dalam contoh di atas.

Referensi

slm
sumber
-1

port bsd (kumpulan paket) memiliki program yang dapat melakukan ini:
http://man.openbsd.org/OpenBSD-current/man1/xidle.1
itu tersedia misalnya di sini:
http://distcache.freebsd.org/local- distfiles / novel / xidle-26052015.tar.bz2

membangun seperti:

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

perhatikan bahwa -program perlu memuat path lengkap ke biner, karena ini diteruskan ke execv ().

$ xidle -timeout 120 -program "/usr/bin/xlock -mode pyro"  
r00t
sumber