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

19

Ketika saya menjalankan:

watch 'cmd >> output.txt' &

pekerjaan ditangguhkan oleh sistem:

3569 Berhenti (tty output)

Apakah ada solusinya?

Juliusz
sumber

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
Michael Mrozek
sumber
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 &
mike dangelo
sumber
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.

Stéphane Gimenez
sumber
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'
l0b0
sumber
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
Raúl Salinas-Monteagudo
sumber
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
SDK
sumber
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 &
X Tian
sumber