Недавно задался таким необычным вопросом, как обустройство скринсейвера в шелле. На самом деле, мне был нужен не совсем скринсейвер, но сути дела это не меняет: после некоторого времени простоя в терминале должна выполниться заданная команда (а что уж она будет делать - дело десятое)
Итак, приступим. За костыли просьба сильно не пинать ^_^
В zsh есть такая полезная переменная окружения как TMOUT. Цитата из man zshall:
TMOUT If this parameter is nonzero, the shell will receive an ALRM
signal if a command is not entered within the specified number
of seconds after issuing a prompt. If there is a trap on
SIGALRM, it will be executed and a new alarm is scheduled using
the value of the TMOUT parameter after executing the trap. If
no trap is set, and the idle time of the terminal is not less
than the value of the TMOUT parameter, zsh terminates. Other?
wise a new alarm is scheduled to TMOUT seconds after the last
keypress.
Т.е. через
$TMOUT секунд бездействия шеллу будет передан сигнал
ALRM. А на этот сигнал мы уже и можем поставить
trap с каким угодно содержанием.
Казалось бы, вот оно, решение. Но что-то пошло не так.. Или руки у меня кривые, или звезды не так встали, или мы с авторами мана просто друг друга не поняли, но работало оно как описано в мане только если
trap не была установлена. Если же
trap была задана, zsh выполнял ее ровно через
$TMOUT секунд после выполнения последней команды, а не после последнего нажатия клавиши, как должно быть в соответствии с моим пониманием мануала.
Вот тут и начинается мое главное костылестроение
Если фича работает как-то - это уже лучше, чем если бы она не работала никак, правда ведь? О:-) Ну я и приспособил ее к своим нуждам с использованием второй переменной окружения:
TTYIDLE (она показывает время бездействия терминала в секундах, и как раз обнуляется при каждом нажатии клавиши). Простенькое сравнение времени простоя с эталоном, и в благоприятном случае - запуск нашего скринсейвера. Вот и всё.
Окончательный вариант (кусок ~/.zshrc) выглядит примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
TMOUT=60 #~ Каждые 60 секунд после ввода последней команды будет срабатывать SIGALRM #~ (trap 14) и будет проверяться условие IDLELIMIT=360 #~ IDLELIMIT - максимальная величина idle к моменту проверки (замените на #~ удобное вам значение в секундах)
trap 'screensaver' 14 screensaver() { if [ $TTYIDLE -ge $IDLELIMIT ] then #~ ↓↓↓Замените этот блок на собственный ↓↓↓ watch -n 1 tail -n 3 /var/log/wimax echo -ne "\e[1;34;49m[$USER] \e[1;32;49m$PWD# \e[0m" #~ ↑↑↑ Замените этот блок на собственный ↑↑↑ fi }
|
Если вы не хотите, чтобы эта "красота" распространялась не на все сессии zsh - закомментируйте строку с TMOUT в zshrc и передавайте его по отдельности только нужным сессиям. У меня, к примеру, скринсейвер будет только в терминале стартующем вместе с WM, и терминалах, запускающихся из меню, но шеллы в IDE, файловом менеджере и tty-консолях "засыпать" не будут =)
А уж что выбрать в качестве "заставки" пусть подскажет ваша фантазия :) Как вариант: слежение за логами беспроводного соединения (представлено в примере выше), запуск ncmpc для слежения за mpd, запуск cacafire просто для красоты..