472 Stimmen

OS X Bash, Befehl 'watch'

Ich bin auf der Suche nach dem besten Weg, den Linux-Befehl "watch" auf Mac OS X zu duplizieren. Ich möchte alle paar Sekunden einen Befehl ausführen, um den Inhalt einer Ausgabedatei mit "tail" und "sed" nach Mustern zu durchsuchen.

Was ist die beste Option auf einem Mac, und geht das auch ohne Software-Download?

901voto

seantomburke Punkte 9456

Mit Selbstgebrautes installiert:

brew install watch

451voto

Daniel Pittman Punkte 16427

Sie können die Grundfunktionen mit der Shell-Schleife emulieren:

while :; do clear; your_command; sleep 2; done

Dies führt zu einer Endlosschleife, löscht den Bildschirm, führt Ihren Befehl aus und wartet zwei Sekunden - die grundlegende watch your_command Umsetzung.

Sie können noch einen Schritt weiter gehen und eine watch.sh Skript, das Folgendes akzeptieren kann your_command y sleep_duration als Parameter:

#!/bin/bash
# usage: watch.sh <your_command> <sleep_duration>

while :; 
  do 
  clear
  date
  $1
  sleep $2
done

44voto

GoTLiuM Punkte 771

Utilice MacPorts :

$ sudo port install watch

22voto

IT Gumby Punkte 1057

Die obigen Shells erfüllen diesen Zweck, und Sie können sie sogar in einen Alias umwandeln (möglicherweise müssen Sie sie in eine Funktion einschließen, um Parameter zu behandeln):

alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'

Beispiele:

myWatch 1 ls ## Self-explanatory
myWatch 5 "ls -lF $HOME" ## Every 5 seconds, list out home directory; double-quotes around command to keep its arguments together

Alternativ dazu, Selbstgebrautes können die Uhr installieren von http://procps.sourceforge.net/ :

brew install watch

19voto

ghoti Punkte 43135

Es kann sein, dass "beobachten" nicht das ist, was Sie wollen. Sie wollen wahrscheinlich um Hilfe bei der Lösung Ihres Problems bitten, nicht bei der Umsetzung Ihrer Lösung! :)

Wenn Ihr eigentliches Ziel darin besteht Aktionen auslösen, die auf den Informationen der tail Befehl dann können Sie das als Teil des Schwanzes selbst tun. Anstatt "periodisch" zu laufen, was das ist, was watch können Sie Ihren Code ausführen auf Anfrage .

#!/bin/sh

tail -F /var/log/somelogfile | while read line; do
  if echo "$line" | grep -q '[Ss]ome.regex'; then
    # do your stuff
  fi
done

Beachten Sie, dass tail -F verfolgt eine Protokolldatei weiter, auch wenn sie von newsyslog oder logrotate rotiert wird. Sie sollten dies anstelle des kleingeschriebenen tail -f . Siehe man tail für Einzelheiten.

Wenn Sie aber wirklich regelmäßig einen Befehl ausführen wollen, können Sie die anderen Antworten in ein kurzes Shell-Skript umwandeln:

#!/bin/sh
if [ -z "$2" ]; then
  echo "Usage: $0 SECONDS COMMAND" >&2
  exit 1
fi

SECONDS=$1
shift 1
while sleep $SECONDS; do
  clear
  $*
done

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X