Endlicher Piepton nach Inaktivität

524
Joe

Ich möchte einen Inaktivitätszeitgeber für ein Terminalfenster (OSX) einstellen können. Wenn ich also n Minuten lang nichts eingetippt hätte, würde es ein "Piepton / Alarm / Run-Skript" geben - dann gibt es noch einen -unfound-by-me-terminal-Befehl / Befehlszeilen-Fu, der das ausführt?

1
Warum willst du das machen? Ist das für so etwas wie das Halten einer SSH-Sitzung? terdon vor 11 Jahren 1
Eigentlich, um mich daran zu erinnern, dass ich offene Sitzungen habe und dass ich entweder daran arbeiten oder sie schließen sollte ... Ich vermute, Sie könnten eine Sitzung am Leben erhalten ... Joe vor 11 Jahren 0

3 Antworten auf die Frage

2
ahilsend

Inaktivitäts-Timer

Einen verzögerten Befehl auszuführen, ist einfach: sleep <sleep time>; run_a_command

Umhüllen der Start / Stopp-Timerfunktionen:

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 } 

Sie können diese Shell-RC-Datei hinzufügen. Jetzt müssen Sie inactivity-start-timervor jeder Eingabeaufforderung und inactivity-stop-timervor jeder Befehlsausführung ausführen. (Sie möchten keinen Piepton, wenn der Befehl zu lange dauert, oder?) Dies setzt auch voraus, dass Sie die Systemklingel eingeschaltet haben, ansonsten geben Sie einen anderen Befehl ein INACTIVITY_CMD.

Bash

Ich vermute, du benutzt bash? In diesem Fall muss PROMPT_COMMAND vor jeder Eingabeaufforderung einen Befehl ausführen. Es ist jedoch nichts eingebaut, um vor jeder Befehlsausführung ausgeführt zu werden. Es gibt einen bekannten Trick, um das hier zu bekommen . So fügen Sie dies auch zu Ihrem .bashrc hinzu:

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

Wenn Sie jedoch zsh verwenden, ist es einfacher :

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

Sie sind sich nicht sicher, ob dies genau das ist, wonach Sie suchen, aber GNU Screen überwacht die Stille, und tmux macht mit dem Befehl monitor- stumm etwas Ähnliches .

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

Ich dachte, das wäre eine interessante Sache. Ich habe kein BSD, also habe ich das Problem unter Linux gelöst. Es gibt so etwas wie inotify für BSD, genannt kqueue (2), aber ich weiß nicht, ob es praktische Monitor-Tools wie inotifywaitfür diese Kernel-Faszilität gibt.

Die Idee ist, die Standardausgabe eines Terminals zu überwachen, bei dem es sich um eine Datei handelt.

#!/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