Bagaimana saya bisa menjalankan `watch` sebagai pekerjaan latar belakang?


Jawaban:


26

Tujuannya watchadalah untuk menunjukkan hasil dari layar penuh perintah dan memperbarui terus menerus; jika Anda mengarahkan output ke file dan melatar belakanginya, sebenarnya tidak ada alasan untuk menggunakan arloji.

Jika Anda hanya ingin menjalankan perintah berulang dengan penundaan ( watchmenunggu dua detik secara default), Anda dapat menggunakan sesuatu seperti ini:

while true; do
    cmd >> output.txt
    sleep 2
done

Apakah ada cara untuk melakukan ini dengan cara yang tidak menghalangi? Sebagai contoh jika saya ingin menempatkan ini dan perintah lain dalam skrip bash tunggal, dan apakah itu terus menjalankan kode yang datang setelah ini (sambil tetap melakukan ini di latar belakang)?
Austin

14

Begini caranya:

watch -n 1 'date' &>/dev/null &

Karena Anda melatarbelakangi proses tersebut, kami dapat menganggap Anda tidak memerlukan tampilan terminal dan Anda akan diarahkan ke suatu file. Jika Anda melakukannya, Anda akan dapat latar watchtanpa masalah.

sleep, seperti yang disarankan oleh Michael Mrozek, perlahan akan tertinggal yang tidak diinginkan. Selain skrip shell yang berbelit-belit yang memonitor waktu sistem dan mengeksekusi perintah berdasarkan waktu yang telah berlalu, watch -pbisa menjadi pilihan yang baik untuk pengaturan waktu yang tepat.

Untuk ketepatan waktu:

watch -n 1 -p 'date' &>/dev/null &

maaf, bagaimana cara kerjanya? mengapa mungkin hanya menggunakan &dua kali?
phil294

Baca bagian pipa man bashuntuk melihat cara kerja yang pertama &. ;)
Mioriin

11

Saya tidak yakin dengan motivasi Anda, tetapi mungkin ini sudah cukup?

while true; do sleep 2; cmd >>output.txt; done &

Kalau tidak, tolong jelaskan mengapa Anda benar-benar membutuhkan watch.


2

teeadalah temanmu Misalnya, inilah cara Anda dapat menampilkan jumlah file di direktori saat ini, dan menambahkannya ke count.txt setiap 2 detik:

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'

2

Tergantung pada motivasi Anda:

  • Anda ingin menjalankan sesuatu secara berkala. Maka Anda bisa menggunakan cron secara langsung. (Jika perincian waktu 1 menit sudah cukup untuk keperluan Anda).

    • Catatan: Jika intervalnya sangat pendek atau perangkat sangat terbatas, dan kecuali Anda mengkonfigurasi syslog untuk mencatat lebih sedikit pesan dari crond, itu akan mengisi syslog Anda dengan cepat.
  • Anda ingin menjalankan sesuatu berulang kali:

    while sleep 2 ; do
      cmd
    done >& log.txt

    (Anda dapat menjalankan ini dari crontab misalnya, meskipun menggunakan skrip sangat disarankan).

  • Anda ingin menjalankan perintah secara berkala dan memiliki akses ke output dari eksekusi terakhirnya.

    • Anda dapat menulis output ke ramfs (memodifikasi skrip sebelumnya):

      while sleep 2 ; do
        cmd >& last_execution.log
      done 

      atau bahkan lebih baik:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • Anda dapat menggabungkan screendan watch, sehingga Anda selalu dapat memeriksa status terbaru, asalkan cocok dalam satu layar penuh:

      screen watch -n 3660 ./make-backup.sh


0

Jika Anda harus menggunakan watch- Cukup gabungkan jawaban dari mike dangelo dan l0b0

watch -n 1 'cmd | tee -a output.txt' &>/dev/null &

misalnya

watch -n 1 'date | tee -a output.txt' &>/dev/null &

lalu saksikan detik-detik berlalu

tail -f output.txt

0

Arloji dirancang untuk menampilkan ke layar, tetapi keluarannya dapat dialihkan (baik stdout dan stderr) kemudian akan berjalan di latar belakang.

watch 'date >>fa' >/dev/null 2>/dev/null &
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.