352 votes

Bash OS X, commande "watch

Je cherche le meilleur moyen de dupliquer la commande Linux 'watch' sur Mac OS X. J'aimerais exécuter une commande toutes les quelques secondes pour effectuer une recherche de motifs sur le contenu d'un fichier de sortie en utilisant 'tail' et 'sed'.

Quelle est la meilleure option sur un Mac, et cela peut-il se faire sans télécharger de logiciel ?

3 votes

Parce que je devrais configurer tous les Macs du bureau qui utilisent mon script.

0 votes

Brew's Watch ne semble pas détecter les commandes sur mon chemin ou mes alias.

0 votes

Au lieu d'une commande, vous pouvez également utiliser l'application /Applications/Utilities/Console.app pour surveiller les fichiers journaux. Elle permet de filtrer avec une recherche de base

681voto

hawaiianchimp Points 660

Con Homebrew installé :

brew install watch

38 votes

C'est définitivement le chemin à suivre si vous utilisez brew sur Mac.

3 votes

Des détails supplémentaires seraient appréciés. Lorsque je cherche "brew watch osx", c'est le premier résultat de recherche. EDIT : Apparemment c'est une commande Linux. Pour ceux qui n'étaient pas sûrs de savoir comment utiliser watch : stackoverflow.com/questions/13593771/

5 votes

Ce site watch de brew ne semble pas lire les alias des utilisateurs. Lorsque l'on exécute watch somealias j'obtiens une commande non trouvée.

401voto

Daniel Pittman Points 7394

Vous pouvez émuler la fonctionnalité de base avec la boucle shell :

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

Cela tournera en boucle, effacera l'écran, exécutera votre commande et attendra deux secondes. watch your_command mise en œuvre.

Vous pouvez aller encore plus loin et créer une watch.sh script qui peut accepter your_command y sleep_duration comme paramètres :

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

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

3 votes

Je crois que watch ne montre que le premier écran de sortie. Si vous voulez faire quelque chose de similaire, changez your_command a your_command 2>&1|head -10

11 votes

Cela fonctionne assez bien, mais je préfère sleep ${2:-1} pour rendre l'intervalle facultatif.

2 votes

Aussi, c'est echo "$(date)" équivalent à date ?

42voto

GoTLiuM Points 169

Utilice MacPorts :

$ sudo port install watch

3 votes

Il n'y a pas de meilleur moyen que d'utiliser le watch directement.

10 votes

Pourquoi utiliser brew au lieu de MacPorts ?

1 votes

@bmauter, chacun son truc : stackoverflow.com/questions/21374366/

20voto

IT Gumby Points 312

Les coquilles ci-dessus feront l'affaire, et vous pourriez même les convertir en alias (vous devrez peut-être les envelopper dans une fonction pour gérer les paramètres) :

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

Exemples :

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

Alternativement, Homebrew peut installer la montre à partir de http://procps.sourceforge.net/ :

brew install watch

1 votes

Pourquoi préférez-vous un alias à une fonction si vous l'enveloppez dans une fonction de toute façon ?

0 votes

Je n'ai pas de préférence intentionnelle ; j'ai simplement l'habitude de créer des alias. Il est possible que ces habitudes soient nées d'anciens shells qui ne reposaient pas sur des fonctions ou ne les prenaient pas en charge, mais je ne peux pas le confirmer.

15voto

ghoti Points 14996

Il se peut que "regarder" ne soit pas ce que vous voulez. Vous voulez probablement demander de l'aide pour résoudre votre problème, pas pour mettre en œuvre votre solution ! :)

Si votre véritable objectif est de déclencher des actions basées sur ce qui est vu par le tail commande vous pouvez le faire dans le cadre de la queue elle-même. Au lieu d'exécuter "périodiquement", ce qui est le cas de watch fait, vous pouvez exécuter votre code sur demande .

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

Notez que tail -F continuera à suivre un fichier journal même s'il est retourné par newsyslog ou logrotate. Vous voulez utiliser ceci à la place de la minuscule tail -f . Vérifier man tail pour les détails.

Cela dit, si vous voulez vraiment exécuter une commande périodiquement, les autres réponses fournies peuvent être transformées en un court shell script :

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

0 votes

Malheureusement, ce shell script ne fonctionne pas avec les paramètres étendus de bash tels que : watch 2 cat *.

1 votes

@CodeCommander - La ligne de commande watch 2 cat * développe les paramètres avant d'exécuter le script, donc dans un répertoire avec les fichiers "foo" et "bar", vous exécuterez cat foo bar toutes les 2 secondes. Quel comportement attendiez-vous ?

0 votes

@ghoti Je signale simplement que le comportement est différent de celui de la commande watch sur Ubuntu. La version Ubuntu exécute apparemment la commande toutes les deux secondes (en développant les paramètres à chaque exécution), ce script a les paramètres développés avant son exécution, puis s'exécute en utilisant les mêmes paramètres toutes les deux secondes. Donc si vous voulez surveiller des fichiers dans un répertoire où des fichiers sont ajoutés et supprimés, ce script ne vous aide pas. Il est cependant utile lorsque vous n'utilisez pas de paramètres étendus :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X