Utas ini di forum ArchLinux berisi program C pendek yang menanyakan xscreensaver untuk informasi berapa lama pengguna telah menganggur, ini tampaknya cukup dekat dengan kebutuhan Anda:
#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);
}
Simpan ini sebagai getIdle.c
dan kompilasi dengan
gcc -o getIdle getIdle.c -lXss -lX11
untuk mendapatkan file yang dapat dieksekusi getIdle
. Program ini mencetak "waktu diam" (pengguna tidak bergerak/mengklik dengan mouse, tidak menggunakan keyboard) dalam milidetik, sehingga skrip bash yang dibuat berdasarkan ini dapat terlihat seperti ini:
#!/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
Ini masih membutuhkan polling reguler, tetapi melakukan semua yang Anda butuhkan...
TMOUT di bash akan menghentikan sesi interaktif setelah jumlah detik yang ditentukan. Anda dapat menggunakan mekanisme itu.
Anda mungkin menangkap logout dengan menyetel jebakan yang sesuai (saya tidak mengujinya), atau dengan menggunakan skrip bash-logout (~/.bash_logout).
Ini adalah jawaban pengguna super yang bagus ke arah itu.
Ini tidak seperti yang Anda minta, tetapi selalu ada batch
-command (biasanya doa khusus dari at
-command dan menggunakan atd
-daemon).
batch
memungkinkan Anda memberi isyarat perintah untuk dijalankan ketika rata-rata beban turun di bawah batas tertentu (biasanya 1,5, tetapi ini dapat diatur saat memulai atd
). Dengan at
itu juga memungkinkan untuk memberi isyarat pekerjaan sedemikian rupa daripada dijalankan pada waktu tertentu; pekerjaan baru saja dikirim ke batch
pada saat itu, dan dijalankan pertama kali saat rata-rata beban turun (misalnya, dijalankan segera setelah rata-rata beban turun di bawah 1,5 beberapa saat setelah pukul 02.00).
Sayangnya pekerjaan batch kemudian akan berjalan sampai akhir, itu tidak akan berhenti jika komputer tidak lagi menganggur.
+++
Jika Anda harus pergi ke rute pemrograman (yang terlihat seperti dari jawaban lain), saya rasa saya akan mencoba membuat sesuatu yang mirip dengan atd
atau crond
daemon, yang memantau pengguna yang masuk dan/atau rata-rata beban. Daemon ini kemudian dapat menjalankan skrip/program dari direktori tertentu, dan memulai/melanjutkan atau menghentikannya (dengan sinyal) sesuai kebutuhan.