solomenikm 22.07.2010 19:44
Есть вопрос! — Выполнение комманды при переходе в бездейсвие
У меня такой вопрос: как сделать так чтобы при неактивности пользователя скажем в пять минут выполнялась команда "начать качать порно с трекера", а при появлении пользователя - "прекратить качать порно с трекера". Спасибо.
А вось welinux'у позиции по этому запросу в google подниму :)
Как можно? И чтоб он еще и при закрытии заставки вторую команду выполнил...
Как можно? И чтоб он еще и при закрытии заставки вторую команду выполнил...
бинго :)
man xscreenserver
чьёрт, оказывается обратная задача решается проще...
man xscreenserver
programs (class Programs)
The graphics hacks which xscreensaver runs when the user is idle. The value of this
resource is a multi-line string, one sh-syntax command per line. Each line must contain
exactly one command: no semicolons, no ampersands.
The graphics hacks which xscreensaver runs when the user is idle. The value of this
resource is a multi-line string, one sh-syntax command per line. Each line must contain
exactly one command: no semicolons, no ampersands.
чьёрт, оказывается обратная задача решается проще...
хор вопрос. крон тут не при чем. это не расписание. это раз
а я делал такое для себя: мониторинг своей активности: какие окна открыты, сколько времени + графики в MatplotLib
принцип демона-клиента
демон: создается файл. при твоей активности демон дает отсрочку процессу, который его удаляет. Фишка в том, что я не знаю метода отследить активность, кроме как читать из /dev/input КАК ИНАЧЕ?!!
клиент: пока есть файл собирает пишет статистику.
вариантов демона два:
на баше, работает как форк бомба, родитель постоянно килляет детей
второй на питоне, использует очередь как сигнал для завершения треда, который собирается по таймауту убить файл активности.
а я делал такое для себя: мониторинг своей активности: какие окна открыты, сколько времени + графики в MatplotLib
принцип демона-клиента
демон: создается файл. при твоей активности демон дает отсрочку процессу, который его удаляет. Фишка в том, что я не знаю метода отследить активность, кроме как читать из /dev/input КАК ИНАЧЕ?!!
клиент: пока есть файл собирает пишет статистику.
вариантов демона два:
на баше, работает как форк бомба, родитель постоянно килляет детей
#!/bin/bash
# please, cat /proc/bus/input/devices
MOUSE='/dev/input/mouse0'
KEYBOARD='/dev/input/event2'
if < ! -r $MOUSE >; then
echo "No permissions to $MOUSE"
exit 1
fi
if < ! -r $KEYBOARD >; then
echo "No permissions to $KEYBOARD"
exit 1
fi
FILE=/tmp/.awesome_is_watching
#this file keeps system think you're on
TIMEOUT=30
KILLING=/tmp/.kills
checker () {
touch $FILE
sleep $TIMEOUT
rm $FILE &>/dev/null
}
while true; do
checker &
CHECKER_PID=$!
: > $KILLING
(cat $MOUSE | od -N 3 > $KILLING) &
MOUSE_CHK_PID=$!
(cat $KEYBOARD | od -N 3 > $KILLING) &
KEYB_CHK_PID=$!
(while < `ps aux | grep 'mplayer\|vlc' | grep -v grep | wc -l` -eq 0 >; do sleep $TIMEOUT ;done; echo 'VIDEO!' > $KILLING) &
MPLAYER_CHK_PID=$!
while < `cat $KILLING | wc -l` -eq 0 >; do
sleep 1
done
# Now we can sleep as long as the checker would sleep
# "now" - "timestamp of $FILE" - $TIMEOUT
if < -e $FILE >; then
kill -9 $CHECKER_PID
TIMESTAP=`stat -c %X $FILE`
NOW=`date +%s`
NO_FORK=`expr $NOW - $TIMESTAP`
SEC_LEFT=`expr $TIMEOUT - $NO_FORK + 1`
sleep $SEC_LEFT
fi
kill -9 $KEYB_CHK_PID
kill -9 $MOUSE_CHK_PID
kill -9 $MPLAYER_CHK_PID
done
второй на питоне, использует очередь как сигнал для завершения треда, который собирается по таймауту убить файл активности.
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import os
from threading import Thread
import Queue
import select
import time
#DEVICES = <'/dev/input/mouse0', '/dev/input/event3'>
DEVICES = <'/dev/input/mouse0', '/dev/input/event2'>
for d in DEVICES:
if not os.access(d, os.R_OK): sys.exit('No permissions to %s' % d)
FILE = '/tmp/.awesome_is_watching'
#this file keeps system think you're on
TIMEOUT = 30
KILLING = '/tmp/.kills'
KILL_POINTER = 0
KILL_ACTIVITY_CHECK = 0
def pointer(fd, kill_me_queue):
global KILL_POINTER
if not os.access(fd, os.F_OK):
open(fd, 'w').close()
try:
x = kill_me_queue.get(True, TIMEOUT)
#print 'break success!'
return 1
except Queue.Empty:
os.unlink(fd)
return 0
def activity_check(devices, signal_fd):
global KILL_POINTER
queue = Queue.Queue(1)
Thread(target=pointer, args=(signal_fd,queue)).start()
while 1:
rlist = <>
for i in devices:
rlist.append(open(i))
ret = select.select(rlist, <>, <>, 1)
#print ret
if ret<0>:
#print 'break!'
break
# Somthing active!
#KILL_POINTER = 1
queue.put('kill yourself!!')
return 0
if __name__ == "__main__":
while 1:
try:
activity_check(DEVICES, FILE)
except KeyboardInterrupt:
sys.exit()
а еще я гентушнег
у тебя обратная ситуация. клиент должен проверять, что файла активности нет.
как-то так...
как-то так...
Ниче не понял в этих скриптах - буду разбираться. Вообще активность пользователя думал проверять по статусу в Pidgin (как сам статус в нем проверить пока не нашел).
pidgin... нестандартно ;)
но как-то нечестно... давайте учитесь ;)
а скрипты только не вам, не воображате.
Вам спасибо, что я про них вспомнил ;)
но как-то нечестно... давайте учитесь ;)
а скрипты только не вам, не воображате.
Вам спасибо, что я про них вспомнил ;)
Вопрос возможно не совсем в тему, но как можно ввести команду в консоли и заставить её выполниться через некоторое время?
Такая строка удалит домашние каталоги пользователей через 100500 секунд.
sleep 100500; rm -rf /home
Вопросы?
sleep 100500; rm -rf /home
Вопросы?
sleep 10 && your_cmd
А чем отличается от "sleep 30; your_cmd"?
А чем отличается от "sleep 30; your_cmd"?
по Сtrl-C та что с амперсандами не выполнится вообще. с точкозапятой - выполнится раньше времени (по нажатию этому)
Улыбнуло)
Может быть http://welinux.ru/post/3497/ ?
Уже было, было это и не раз.
sudo apt-get install xautolock
man xautolock
И ещё тыц для юзеров zsh.
И хватит изобретать велосипеды.
sudo apt-get install xautolock
man xautolock
И ещё тыц для юзеров zsh.
И хватит изобретать велосипеды.
Есть такая тема: есть папочка /usr/share/applications/screensavers/ откуда запускаются и прекращают свою работу заставки. Возможно можно как-то к заставкам нужные команды прикрутить?
Пример файла:
Пример файла:
Encoding=UTF-8
Name=BioF
Comment=This is an attempt to recreate some of the work of William Latham. Take a look at the program 'organic art' at this site (http://www.artworks.co.uk).
TryExec=biof
Exec=biof -r
StartupNotify=false
Terminal=false
Type=Application
Categories=Screensaver
file test.sh
file kill_it
P.S. Сильно не смеяться; Рассчитано на Gnome и возможно не работает, нет скрипта download_pron.
#!/bin/bash
while << `pgrep -c 'gnome-screensaver'` -eq 0 >>
do
sleep 10s
done
./kill_it || ./download_pron
exit
file kill_it
#!/bin/bash
while << `pgrep -c 'gnome-screensaver'` -eq 1 >>
do
while << `pgrep -c 'gnome-screensaver'` -eq 0 >>
do
pgrep "" | kill && exit
done
done
exit
P.S. Сильно не смеяться; Рассчитано на Gnome и возможно не работает, нет скрипта download_pron.
вот блин, не ту копию отправил.
file kill_it
file kill_it
pgrep "test.sh" | kill
pgrep "download_pron" | kill || pgrep "test.sh"
Емнип, в кде в настройке питания можно добавлять собственные скрипты для реакции на события. Событий там много - вкл/ выкл питание, нажатие кнопок питания, заряд батареи, закрытие крышки ноутбука, простои. ПОКОВЫРЯЙ @ СДЕЛАЙ.
Вот тут есть прикольная штука:
Как я понял она пишет ноль если "активен", в противном случаи - время простоя.
Из чего вытекает вот такой вот скрипт:
Не знаю одного: как передать значение xset q | sed '/^Scre... в переменную.
Есть идеи?
xset q | sed '/^Screen Saver:/,/^<^ >/ { s/.*timeout: *\(<0-9>*\).*/\1/; t }; d'
Как я понял она пишет ноль если "активен", в противном случаи - время простоя.
Из чего вытекает вот такой вот скрипт:
#!/bin/bash
while true; do
sleep 2
xset q | sed '/^Screen Saver:/,/^<^ >/ { s/.*timeout: *\(<0-9>*\).*/\1/; t }; d'
done
Не знаю одного: как передать значение xset q | sed '/^Scre... в переменную.
Есть идеи?
Благодаря прону, появился не только open source, но и все человечество))
Процесс мышления типичного молодого программиста. =) Вы меня извините ради б-га, я просто не удержался.
Я просто хотел сказать что нужно отслеживать работу скринсейвера, и зачем то попытался это реализовать... Больше так не буду :D
Можно сделать запуск скринсейвера через 5 минут, а уже к нему прикрутить свою команду. http://live.gnome.org/GnomeScreensaver/FrequentlyAskedQuestions#Is_there_a_way_to_perform_actions_when_the_screensaver_activates_or_deactivates.3F__Or_when_the_session_becomes_idle.3F
не знаю, насколько правильно, но я бы сделал это через dbus, именно для этого он и был придуман. org.freedesktop.ScreenSaver, отслеживать сигнал ActiveChanged. не?
что-то типа такого:
# -*- coding: utf-8 -*-
import os, dbus, dbus.glib
def active_changed_slot(f):
if f == 1:
#выполняем деяствия, при активации скринсейвера
elif f == 0:
#ну вы поняли
dbus_loop = dbus.glib.DBusGMainLoop()
bus = dbus.SessionBus(mainloop=dbus_loop)
screensaver_service = bus.get_object('org.freedesktop.ScreenSaver', '/ScreenSaver')
bus.add_signal_receiver(active_changed_slot, 'ActiveChanged', 'org.freedesktop.ScreenSaver', 'org.freedesktop.ScreenSaver', '/ScreenSaver')
os.fork()
что-то я напортачил
так лучше:
так лучше:
# -*- coding: utf-8 -*-
import dbus, dbus.glib, gtk
def active_changed_slot(f):
if f == 1:
pass
#выполняем деяствия, при активации скринсейвера
elif f == 0:
pass
#ну вы поняли
dbus_loop = dbus.glib.DBusGMainLoop()
bus = dbus.SessionBus(mainloop=dbus_loop)
screensaver_service = bus.get_object('org.freedesktop.ScreenSaver', '/ScreenSaver')
bus.add_signal_receiver(active_changed_slot, 'ActiveChanged', 'org.freedesktop.ScreenSaver', 'org.freedesktop.ScreenSaver', '/ScreenSaver')
gtk.main()
А вы пробовали этот скрипт запускать? У меня выдает ошибку синтаксиса в четвертой строке.
пробовал, работает
запускал вот это:
запускал вот это:
# -*- coding: utf-8 -*-
import dbus, dbus.glib, gtk
def active_changed_slot(f):
if f == 1:
print 'active'
elif f == 0:
print 'inactive'
dbus_loop = dbus.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus(mainloop=dbus_loop)
screensaver_service = bus.get_object('org.freedesktop.ScreenSaver', '/ScreenSaver')
bus.add_signal_receiver(active_changed_slot, 'ActiveChanged', 'org.freedesktop.ScreenSaver', 'org.fr$
gtk.main()
неправильно скопировал
вот это запускал, все работает:
вот это запускал, все работает:
# -*- coding: utf-8 -*-
import dbus, dbus.glib, gtk
def active_changed_slot(f):
if f == 1:
print 'active'
elif f == 0:
print 'inactive'
dbus_loop = dbus.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus(mainloop=dbus_loop)
screensaver_service = bus.get_object('org.freedesktop.ScreenSaver', '/ScreenSaver')
bus.add_signal_receiver(active_changed_slot, 'ActiveChanged', 'org.freedesktop.ScreenSaver', 'org.freedesktop.ScreenSaver', '/ScreenSaver')
gtk.main()
Нашел такой скрипт на perl
Не работает. Не могу понять в чем причина. Есть идеи?
my $cmd = "dbus-monitor --session \"type='signal',interface='org.gnome.ScreenSaver',member='SessionIdleChanged'\"";
open (IN, "$cmd |");
while (<IN>) {
if (m/^\s+boolean true/) {
print "*** Session is idle ***\n";
} elsif (m/^\s+boolean false/) {
print "*** Session is no longer idle ***\n";
}
}
Не работает. Не могу понять в чем причина. Есть идеи?
Палитесь, товарищ. А вообще можно вроде как-то на заставку привесить