Chcę uruchomić polecenie, gdy użytkownik stanie się nieaktywny (system jest bezczynny). Na przykład:
echo "You started to be inactive."
Ponadto, gdy użytkownik ponownie stanie się aktywny (system nie jest już bezczynny):
echo "You started to be active, again."
Potrzebuję skryptu powłoki, który to zrobi. Czy to możliwe bez timera / interwału? Może jakieś zdarzenia systemowe?
Odpowiedzi:
Wątek na forach ArchLinux zawiera krótki program C, który wysyła zapytanie do programu xscreensaver w celu uzyskania informacji o tym, jak długo użytkownik jest bezczynny.
Zapisz to jako
getIdle.c
i skompiluj zaby uzyskać plik wykonywalny
getIdle
. Ten program wypisuje „czas bezczynności” (użytkownik nie porusza się / nie klika myszą, nie używa klawiatury) w milisekundach, więc skrypt bash oparty na tym może wyglądać następująco:To wciąż wymaga regularnego odpytywania, ale robi wszystko, czego potrzebujesz ...
źródło
xprintidle
, który jest dostępny w większości dystrybucji i robi dokładnie to samo.TMOUT w bash zakończy sesję interaktywną po ustalonej liczbie sekund. Możesz użyć tego mechanizmu.
Możesz przechwycić wylogowanie, ustawiając odpowiednią pułapkę (tego nie testowałem) lub używając skryptów bash-logout (~ / .bash_logout).
Oto dobra odpowiedź superużytkownika w tym kierunku.
źródło
$TMOUT
kilku sekund.EXIT
pułapki lub z.bash_logout
.Nie jest to dokładnie to, o co prosiłeś, ale zawsze istnieje
batch
polecenie (zwykle specjalne wywołanieat
polecenia i użycie -daemonaatd
).batch
pozwala podpowiedzieć komendę, która ma zostać uruchomiona, gdy średnia wartość obciążenia spadnie poniżej określonego limitu (zwykle 1,5, ale można to ustawić podczas uruchamianiaatd
). Dziękiat
temu możliwe jest także wskazanie zadania w taki sposób, że zamiast być uruchamianym w określonym czasie; zadanie jest właśnie dostarczanebatch
w tym czasie i jest uruchamiane po raz pierwszy, gdy spada średnie obciążenie (np. jest uruchamiane, gdy średnia obciążenie spadnie poniżej 1,5 po 2:00 rano).Niestety zadanie wsadowe zostanie następnie uruchomione do końca, nie zatrzyma się, jeśli komputer nie będzie już bezczynny.
+++
Jeśli musisz przejść ścieżkę programowania (która wygląda na inne odpowiedzi), myślę, że spróbowałbym stworzyć coś podobnego do demonów
atd
lubcrond
demonów, które monitorowałyby zalogowanych użytkowników i / lub średnie obciążenie. Ten demon może następnie uruchamiać skrypty / programy z określonego katalogu i uruchamiać / kontynuować lub zatrzymać je (z sygnałami) w razie potrzeby.źródło
.lock
plików, możesz łatwo poradzić sobie z problemami z czasem.Ten wątek ma kilka rozwiązań opartych na wykrywaniu aktywności klawiatury i myszy. Uciekam
xprintidle
od zadania crona, które zaczyna się co kilka minut. Ale, jak wskazują,xprintidle
jest nieobsługiwany, więc możesz chcieć zainstalować moduł Perla i użyć go zamiast tego:Skorzystałbym z obu rozwiązań poprzez odpytywanie z crona w skrypcie, który kończy się u góry, jeśli interfejs użytkownika nie był wystarczająco bezczynny. Oczywiście skrypt będzie potrzebował
export DISPLAY=:0.0
, aby rozmawiać z X11.Pamiętaj, że klawiatura i mysz mogą być nieaktywne podczas oglądania filmu lub wykonywania zadań obciążających procesor.
źródło
Nie znam sposobu, aby to zrobić bez odpytywania statystyk systemu, jak inne odpowiedzi używają wygaszacza ekranu lub licznika czasu bezczynności bash lub uruchamiania z .bash_logout, ale oto pomysł, aby sprawdzić użycie procesora.
Wciąż wiązałoby się to z odpytywaniem co n sekund, a jeśli użycie procesora jest mniejsze niż wybrana ilość, możesz wykonać skrypt, co chcesz uruchomić. Jednak cokolwiek uruchomisz, może zwiększyć użycie procesora, ale możesz użyć ładnych „rzeczy”, aby go nie policzyć.
Oto skrypt testowy przy użyciu top, ale możesz zamiast tego użyć mpstat lub zamiast tego sprawdzić średnie obciążenia?
To tylko skrypt, który przygotowałem, aby przetestować czytanie bezczynności od góry. Możesz parsować,
/proc/stat
ale myślę, że pokazuje tylko całkowity czas i trzeba porównać wyniki w danym przedziale czasowym. Top ma dla mnie swój problem (linux mint 16), przy pierwszym uruchomieniu wydaje się, że nigdy nie zmienia cpustats, tak jakby musiał czekać na parsowanie / proc / stat, dlategotop -bn2
teoretycznietop -bn1
powinno działać.źródło
w
polecenie, które pokazuje czas bezczynności użytkownika. - Nawiasem mówiąc, nie oceniam, po prostu dla mnie chcę wykryć bezczynność, aby uśpić maszynę, oszczędzić energię, a odpytywanie jest temu przeciwne.