Saya ingin menjalankan perintah ketika pengguna menjadi tidak aktif (sistem idle). Sebagai contoh:
echo "You started to be inactive."
Juga, ketika pengguna menjadi aktif kembali (sistem tidak lagi menganggur):
echo "You started to be active, again."
Saya perlu skrip shell yang akan melakukan ini. Apakah ini mungkin tanpa timer / interval? Mungkin beberapa kejadian sistem?
Jawaban:
Utas ini di forum ArchLinux berisi program C pendek yang menanyakan xscreensaver untuk informasi berapa lama pengguna menganggur, ini sepertinya cukup dekat dengan kebutuhan Anda:
Simpan ini sebagai
getIdle.c
dan kompilasi denganuntuk mendapatkan file yang dapat dieksekusi
getIdle
. Program ini mencetak "waktu idle" (pengguna tidak bergerak / mengklik dengan mouse, tidak menggunakan keyboard) dalam milidetik, sehingga skrip bash yang dibangun berdasarkan ini bisa terlihat seperti ini:Ini masih membutuhkan jajak pendapat rutin, tetapi melakukan semua yang Anda butuhkan ...
sumber
xprintidle
, yang tersedia di sebagian besar distribusi dan melakukan hal yang persis sama.TMOUT dalam bash akan mengakhiri sesi interaktif setelah jumlah detik yang ditentukan. Anda dapat menggunakan mekanisme itu.
Anda dapat menangkap logout dengan mengatur jebakan yang sesuai (saya tidak mengujinya), atau dengan menggunakan skrip bash-logout (~ / .bash_logout).
Berikut adalah jawaban pengguna super yang baik ke arah itu.
sumber
$TMOUT
detik berlalu.EXIT
jebakan atau dari.bash_logout
.Ini bukan apa yang Anda minta, tetapi selalu ada
batch
perintah-(biasanya doa khusus-at
perintah dan menggunakanatd
-daemon).batch
memungkinkan Anda mengeluarkan perintah untuk dijalankan ketika rata-rata beban turun di bawah batas tertentu (biasanya 1,5, tetapi ini dapat diatur saat memulaiatd
). Denganat
itu juga mungkin untuk memberi isyarat pekerjaan sedemikian rupa sehingga bukannya dijalankan pada waktu tertentu; pekerjaan baru dikirim padabatch
saat itu, dan pertama kali dijalankan ketika rata-rata beban turun (mis. itu berjalan segera setelah rata-rata beban turun di bawah 1,5 kadang-kadang setelah pukul 02:00).Sayangnya, batch-job akan berjalan ke akhir, tidak akan berhenti jika komputer tidak lagi menganggur.
+++
Jika Anda harus mengikuti rute pemrograman (yang terlihat dari jawaban lain), saya pikir saya akan mencoba membuat sesuatu yang mirip dengan
atd
ataucrond
daemon, yang memantau pengguna yang masuk dan / atau memuat rata-rata. Daemon ini kemudian dapat menjalankan skrip / program dari direktori tertentu, dan memulai / melanjutkan atau menghentikannya (dengan sinyal) sesuai kebutuhan.sumber
.lock
file Anda dapat dengan mudah menangani masalah waktu.Utas ini memiliki beberapa solusi berdasarkan mendeteksi aktivitas keyboard dan mouse. Saya lari
xprintidle
dari pekerjaan cron yang dimulai setiap beberapa menit. Tetapi karena mereka menunjukkanxprintidle
tidak terawat, jadi Anda mungkin ingin menginstal modul Perl dan menggunakannya:Saya akan menggunakan salah satu solusi dengan polling dari cron, dalam skrip yang keluar di bagian atas jika UI belum cukup menganggur. Tentu saja skrip akan membutuhkan
export DISPLAY=:0.0
untuk berbicara dengan X11.Ingatlah bahwa keyboard dan mouse Anda mungkin tidak aktif saat menonton film, atau menjalankan tugas yang berat CPU.
sumber
Saya tidak tahu cara untuk melakukan ini tanpa polling semacam statistik sistem, seperti jawaban lain menggunakan screensaver atau penghitung waktu bash, atau menjalankan dari .bash_logout, tapi di sini ada ide untuk memeriksa penggunaan CPU.
Ini masih akan melibatkan pemungutan suara setiap n detik, dan jika penggunaan CPU Anda di bawah jumlah apa pun yang Anda pilih maka Anda dapat skrip apa pun yang ingin Anda jalankan. Namun, apa pun yang Anda jalankan dapat meningkatkan penggunaan CPU, tetapi Anda bisa menggunakan "barang" Anda dengan baik untuk tidak menghitungnya.
Berikut ini skrip pengujian menggunakan top, tetapi Anda dapat menggunakan mpstat saja, atau periksa rata-rata pemuatan?
Itu hanya naskah yang saya lempar bersama untuk menguji membaca idle dari atas. Anda dapat menguraikan
/proc/stat
tetapi saya pikir ini hanya menunjukkan waktu total, dan Anda harus membandingkan hasilnya dalam suatu interval. Top memiliki masalah sendiri untuk saya (linux mint 16), pada menjalankan pertama tampaknya tidak pernah mengubah cpustats, seolah-olah harus menunggu untuk menguraikan / proc / stat itu sendiri, makatop -bn2
secara teori tetapi secara teoritop -bn1
harus bekerja.sumber
w
perintah yang menunjukkan waktu idle pengguna. - Ngomong-ngomong aku tidak menghakimi, hanya saja bagiku, aku ingin mendeteksi idle untuk mematikan mesin, menghemat daya, dan pemungutan suara menentangnya.