OSX bash, perintah 'jaga'

292

Saya mencari cara terbaik untuk menduplikasi perintah 'menonton' Linux di Mac OSX. Saya ingin menjalankan perintah setiap beberapa detik untuk mencocokkan pola pada isi file output menggunakan 'tail' dan 'sed'.

Apa pilihan terbaik saya di Mac, dan dapatkah itu dilakukan tanpa mengunduh perangkat lunak?

joseph.hainline
sumber
2
Mengapa Anda ingin menduplikasinya ketika Anda bisa menginstalnya?
Andrew Marshall
3
karena saya harus mengonfigurasi semua Mac di kantor yang menggunakan skrip saya
joseph.hainline
Saya menyarankan agar skrip Anda menginstal pembuatan dan menonton.
AsTeR
arloji arloji sepertinya tidak menerima perintah di jalan saya atau alias.
sam boosalis
Atau untuk perintah Anda juga bisa menggunakan aplikasi / Aplikasi /Utilities/Console.app untuk memantau file log. Ini memungkinkan penyaringan dengan pencarian dasar
JuanMa Cuevas

Jawaban:

335

Anda dapat meniru fungsionalitas dasar dengan loop shell:

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

Itu akan berulang selamanya, kosongkan layar, jalankan perintah Anda, dan tunggu dua detik - dasar watch your_command implementasi .

Anda dapat mengambil langkah ini lebih jauh dan membuat watch.shskrip yang dapat menerima your_commanddan sleep_durationsebagai parameter:

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

while :; 
  do 
  clear
  date
  $1
  sleep $2
done
Daniel Pittman
sumber
2
Saya percaya arloji hanya menampilkan layar penuh keluaran pertama. Jika Anda ingin melakukan sesuatu yang serupa, ubah your_commandkeyour_command 2>&1|head -10
Mark Eirich
10
Ini bekerja cukup baik, tetapi saya lebih suka sleep ${2:-1}untuk membuat interval opsional.
Daniel Lubarov
2
Juga, ini echo "$(date)"setara dengan date?
Daniel Lubarov
5
Itu juga tidak bekerja dengan pipa. Berikut adalah percabangan dengan berbagai peningkatan: daniel.lubarov.com/simple-watch-script-for-osx
Daniel Lubarov
Tidak berfungsi seperti watchsaat output lebih dari satu layar. Hanya menunjukkan akhir, sedangkan watchhanya menunjukkan atas. (Tidak ada yang ideal)
h__
545

Dengan Homebrew diinstal:

brew install watch

seantomburke
sumber
23
Pasti cara untuk pergi jika Anda menggunakan brewdi mac.
Maxence
2
Lebih detail akan dihargai. Ketika saya mencari "brew watch osx", ini adalah hasil pencarian teratas. EDIT: Rupanya itu perintah Linux. Bagi mereka yang tidak yakin bagaimana cara menggunakan watch: stackoverflow.com/questions/13593771/…
gwg
2
Ini watchdari buatan tampaknya tidak membaca alias pengguna. Saat menjalankan watch somealias, saya mendapatkan perintah yang tidak ditemukan.
RNickMcCandless
@NickMc cara yang tepat untuk menggunakan jam tangan adalah watch [command]ketika Anda menggunakannya watch somealiasdengan anggapan bahwa itu somealiasadalah perintah yang dapat Anda jalankan di terminal Anda.
seantomburke
38

Gunakan macport :

$ sudo port install watch
GoTLiuM
sumber
3
Tidak ada cara yang lebih baik daripada menggunakan watchperintah secara langsung.
Oliver
8
Mengapa menggunakan bir daripada MacPorts?
bmauter
1
@bmauter, untuk masing-masing: stackoverflow.com/questions/21374366/…
CenterOrbit
4
@ CenterOrbit, itu sebabnya saya bertanya. @ joseph.hainline mengatakan tidak menggunakan MacPorts, tetapi tidak menyebutkan alasannya. Apakah watchperintahnya rusak di MacPorts?
bmauter
Itu tidak rusak. Itu saran yang mengerikan. MacPorts berfungsi dengan baik dan memiliki banyak paket. Gunakan.
Ali Gangji
16

shell di atas akan melakukan triknya, Anda bahkan bisa mengonversinya menjadi alias (mungkin perlu membungkus fungsi untuk menangani parameter)

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

Contoh:

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

Sebagai alternatif, homebrew dapat memasang arloji dari http://procps.sourceforge.net/

brew install watch
Gumby
sumber
14

Mungkin "menonton" bukan yang Anda inginkan. Anda mungkin ingin meminta bantuan dalam menyelesaikan masalah Anda, bukan dalam mengimplementasikan solusi Anda! :)

Jika tujuan Anda sebenarnya adalah untuk memicu tindakan berdasarkan apa yang dilihat dari tailperintah , maka Anda dapat melakukannya sebagai bagian dari ekor itu sendiri. Alih-alih menjalankan "secara berkala", yang watchberfungsi, Anda dapat menjalankan kode sesuai permintaan .

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

Catatan yang tail -Fakan terus mengikuti file log bahkan jika diputar oleh newsyslog atau logrotate. Anda ingin menggunakan ini, bukan huruf kecil tail -f. Periksa man taildetailnya.

Yang mengatakan, jika Anda benar-benar ingin menjalankan perintah secara berkala, jawaban lain yang diberikan dapat diubah menjadi skrip shell pendek:

#!/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
ghoti
sumber
Sayangnya skrip shell ini tidak berfungsi dengan bash parameter yang diperluas seperti: watch 2 cat *
Code Commander
1
@CodeCommander - Baris perintah watch 2 cat *akan memperluas parameter sebelum menjalankan skrip, sehingga dalam direktori dengan file "foo" dan "bar", Anda akan menjalankan cat foo barsetiap 2 detik. Perilaku apa yang Anda harapkan?
ghoti
@ ghoti Saya hanya menunjukkan bahwa perilakunya berbeda dari perintah arloji di Ubuntu. Versi Ubuntu tampaknya menjalankan perintah setiap dua detik (memperluas parameter setiap kali dijalankan), skrip ini memiliki parameter yang diperluas sebelum dijalankan, dan kemudian berjalan menggunakan parameter yang sama setiap dua detik. Jadi, jika Anda ingin menonton file di direktori tempat file ditambahkan dan dihapus, skrip ini tidak membantu. Ini berguna saat Anda tidak menggunakan parameter yang diperluas. :)
Code Commander
@CodeCommander, saya pikir Anda salah. Bash (seperti sh) mengembang *tanpa meneruskannya ke perintah yang Anda jalankan. Coba jalankan:mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/* di satu jendela. Saat sedang berjalan, Anda bisa touch /tmp/zz/bardi jendela lain. Lihat apakah "arloji" Anda melihat perubahan, di jendela pertama. Saya tidak berpikir itu akan terjadi. Bukan untuk saya. Ini tidak ada hubungannya dengan Ubuntu vs OSX atau Linux vs Unix, itu adalah perilaku bashitu sendiri.
ghoti
1
@ Ghoti, kamu benar. Saya salah. Bahkan dengan perintah arloji Linux Anda perlu menggunakan tanda kutip: watch "ls -l /tmp/zz/*"tetapi jika Anda ingat untuk menggunakan tanda kutip itu bekerja dengan skrip Anda juga. :)
Code Commander
10

Pergi dengan jawaban dari sini :

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

Tapi Anda benar-benar lebih baik memasang arloji karena ini tidak terlalu bersih ..

Marvin Pinto
sumber
11
lebih mudah sekarang bahkanbrew install watch
Peter Host
6

Jika arloji tidak ingin dipasang melalui

brew install watch

Ada versi lain yang serupa / salin yang diinstal dan bekerja dengan baik untuk saya

brew install visionmedia-watch

https://github.com/tj/watch

A_funs
sumber
5

Atau, di ~ / .bashrc Anda

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

Saya punya masalah serupa.

Ketika saya googled, saya menemukan tautan ini baru-baru ini. Ini bukan 'menginstal perangkat lunak', hanya mendapatkan biner untuk perintah 'menonton'.

Dan tautannya adalah Dapatkan perintah menonton untuk OSX

sugavaneshb
sumber
1

Inilah versi yang sedikit berubah dari jawaban ini yang:

  • memeriksa args yang valid
  • menunjukkan judul tanggal dan durasi di bagian atas
  • memindahkan argumen "durasi" menjadi argumen pertama, sehingga perintah yang rumit dapat dengan mudah diteruskan sebagai argumen yang tersisa.

Untuk menggunakannya:

  • Simpan ini untuk ~/bin/watch
  • mengeksekusi chmod 700 ~/bin/watchdi terminal untuk membuatnya dapat dieksekusi.
  • coba dengan menjalankan watch 1 echo "hi there"

~ / bin / tonton

#!/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
Taman Brad
sumber
1

Coba ini:

#!/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
Robert Nagtegaal
sumber
1

untuk mencegah kerlipan saat perintah utama Anda membutuhkan waktu yang bisa diselesaikan, Anda dapat menangkap output dan hanya membersihkan layar saat itu selesai.

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

lalu gunakan dengan: watch istats

tungv
sumber
0

Gunakan manajer paket nix !

Instal nix, maka nix-env -iA nixpkgs.watchdan itu harus tersedia untuk digunakan setelah menyelesaikan instruksi instalasi (termasuk sumber . "$HOME/.nix-profile/etc/profile.d/nix.sh"di shell Anda).

galva
sumber