Терминальный гудок после бездействия

424
Joe

Я хотел бы иметь возможность установить таймер неактивности для окна терминала (OSX) - поэтому, если бы я ничего не набирал в течение n минут, это дало бы 'beep / alert / run script' - есть ли пока что -unfound-by-me-терминал команда / командная строка-фу, что это делает?

1
почему ты хочешь сделать это? Это для чего-то вроде поддержания сеанса SSH живым? terdon 11 лет назад 1
На самом деле, чтобы напомнить мне, что у меня открыты открытые сессии и что я должен либо работать над ними, либо закрыть их ... Я подозреваю, что вы могли бы использовать, чтобы поддерживать сеанс в живых ... Joe 11 лет назад 0

3 ответа на вопрос

2
ahilsend

Inactivity timer

Running a delayed command is simple: sleep <sleep time>; run_a_command

Wrapping that in start/stop timer functions:

INACTIVITY_TIME='5m' INACTIVITY_CMD='echo -ne \a' function inactivity-start-timer () { (sleep "$INACTIVITY_TIME"; $INACTIVITY_CMD) & INACTIVITY_PID=$! disown } function inactivity-stop-timer () { kill $INACTIVITY_PID > /dev/null 2>&1 } 

You can add that your shell rc file. Now you need to run inactivity-start-timer before every prompt and inactivity-stop-timer before every command execution. (You don't want a beep if the command takes too long, do you?) Also this assumes you have the system bell on, otherwise put another command into INACTIVITY_CMD.

Bash

I am guessing you use bash? In that case there is PROMPT_COMMAND to run a command before every prompt. But nothing built-in to run before every command execution. There is a known trick to get that here. So add this also to your .bashrc:

PROMPT_COMMAND=inactivity-start-timer preexec () { inactivity-stop-timer } preexec_invoke_exec () { [ -n "$COMP_LINE" ] && return # do nothing if completing [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; preexec "$this_command" } trap 'preexec_invoke_exec' DEBUG 

Zsh

If you use zsh on the other hand its simpler:

autoload -Uz add-zsh-hook add-zsh-hook precmd inactivity-start-timer add-zsh-hook preexec inactivity-stop-timer 
1
jjlin

Not sure if this is exactly what you're looking for, but GNU Screen has silence monitoring, and tmux does something similar with the monitor-silence command.

1
Ярослав Рахматуллин

Я думал, что это было интересно выяснить. У меня нет BSD, поэтому я решил проблему в Linux. Для BSD есть что-то вроде inotify, называемое kqueue (2), но я не знаю, есть ли удобные инструменты мониторинга, такие как inotifywaitэто ядро.

Идея состоит в том, чтобы контролировать стандартный вывод терминала, который является файлом.

#!/bin/bash myterm=/dev/`ps -o tty= | head -n1` if [ $# -eq 0 ] && [ -r $myterm ] && [ ! -d $myterm ]; then terminal=$myterm else terminal=$ fi  function time_out { echo timeout loop=false }  loop=true timeout=4  while $loop; do inotifywait $terminal -qq -t $timeout -e MODIFY || time_out done