web-dev-qa-db-ja.com

OSX bash、 'watch'コマンド

私は、Mac OS XでLinuxの「監視」コマンドを複製するための最良の方法を探しています。 'tail'と 'sed'を使って出力ファイルの内容をパターンマッチングするために数秒ごとにコマンドを実行したいのですが。

Macでの私の最良の選択は何ですか、そしてそれはソフトウェアをダウンロードすることなく行うことができますか?

252
joseph.hainline

シェルループを使って基本的な機能をエミュレートできます。

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

これは永久にループし、画面をクリアし、コマンドを実行し、そして2秒間待ちます - 基本的なwatch your_commandの実装。

これをさらに進めて、パラメータとしてwatch.shおよびyour_commandを受け入れることができるsleep_durationスクリプトを作成できます。

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

while :; 
  do 
  clear
  date
  $1
  sleep $2
done
292
Daniel Pittman

自作 がインストールされている:

brew install watch

455
seantomburke

ports を使ってください。

$ Sudo port install watch
36
GoTLiuM

上記のシェルがうまくいくでしょう、あなたはそれらをエイリアスに変換することさえできます(パラメータを扱うために関数でラップする必要があるかもしれません)

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

例:

myWatch 1 ls ## self-explanatory
myWatch 5 "ls -lF $HOME" ## every 5 seconds, list out home dir; double-quotes around command to keep its args together

あるいは、自作で時計を http://procps.sourceforge.net/ からインストールできます。

brew install watch
16
IT Gumby

それは「見る」ことがあなたが望むものではないということかもしれません。あなたはおそらくあなたの解決策を実行するのではなく、あなたの問題を解決するのに助けを求めたいと思うでしょう! :)

あなたの本当の目的がtailコマンドから見たものに基づいてアクションを起こすであるなら、あなたはそれ自身を末尾の一部として行うことができます。 watchが行うことである「定期的に」実行する代わりに、コードを実行できますオンデマンド

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

Newsyslogやlogrotateによってローテーションされても、tail -Fはログファイルを追跡し続けます。小文字のtail -fの代わりにこれを使いたいのです。詳細についてはman tailを確認してください。

とは言っても、本当に定期的にコマンドを実行したいのであれば、提供される他の答えは短いシェルスクリプトに変えることができます。

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

here から答えを持って行く:

bash -c 'while [ 0 ]; do <your command>; sleep 5; done'

しかし、 watch をインストールすることは、きれいなとは言えません。

9
Marvin Pinto

時計が経由でインストールしたくない場合

brew install watch

私のためにインストールされ、完璧に機能した別の類似した/コピーのバージョンがあります。

brew install visionmedia-watch

https://github.com/tj/watch

5
A_funs

または、〜/ .bashrcに

function watch {
    while :; do clear; date; echo; $@; sleep 2; done
}
4
jon

私は同様の問題を抱えていました。

グーグルしたとき、私は最近このリンクに出くわしました。これは厳密には「ソフトウェアのインストール」ではなく、単に「watch」コマンドのバイナリを取得することです。

そしてリンクは OSX用のwatchコマンドを入手 です。

2
sugavaneshb

あなたのメインコマンドが完了するのに知覚できる時間がかかるときにちらつきを防ぐために、あなたはそれが終わったときにだけ出力をキャプチャしてスクリーンをクリアすることができます。

function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}

それからそれを使ってください:watch istats

1
tungv

これを試して:

#!/bin/bash
# usage: watch [-n integer] COMMAND

case $# in
    0)
        echo "Usage $0 [-n int] COMMAND"
        ;;
    *)      
        sleep=2;
        ;;
esac    

if [ "$1" == "-n" ]; then
    sleep=$2
    shift; shift
fi


while :; 
    do 
    clear; 
    echo "$(date) every ${sleep}s $@"; echo 
    $@; 
    sleep $sleep; 
done
1

nix パッケージマネージャを使ってください。

Nixをインストールしてからnix-env -iA nixpkgs.watchをインストールすると、インストール手順を完了した後で使用できるようになります(シェルでの. "$HOME/.nix-profile/etc/profile.d/nix.sh"の入手を含む)。

1
galva

これはわずかに変更されたバージョンです この答えの それ:

  • 有効な引数をチェックします
  • 上部に日付と期間のタイトルを表示します。
  • "duration"引数を最初の引数に移動するので、複雑なコマンドを残りの引数として簡単に渡すことができます。

使用するには:

  • これを~/bin/watchに保存します
  • 実行可能にするには、端末でchmod 700 ~/bin/watchを実行します。
  • watch 1 echo "hi there"を実行して試してください。

〜/ bin/watch

#!/bin/bash

function show_help()
{
  echo ""
  echo "usage: watch [sleep duration in seconds] [command]"
  echo ""
  echo "e.g. To cat a file every second, run the following"
  echo ""
  echo "     watch 1 cat /tmp/it.txt" 
  exit;
}

function show_help_if_required()
{
  if [ "$1" == "help" ]
  then
      show_help
  fi
  if [ -z "$1" ]
    then
      show_help
  fi
}

function require_numeric_value()
{
  REG_EX='^[0-9]+$'
  if ! [[ $1 =~ $REG_EX ]] ; then
    show_help
  fi
}

show_help_if_required $1
require_numeric_value $1

DURATION=$1
shift

while :; do 
  clear
  echo "Updating every $DURATION seconds. Last updated $(date)"
  bash -c "$*"
  sleep $DURATION
done
1
Brad Parks