Làm thế nào tôi có thể chạy `watch` như một công việc nền?


Câu trả lời:


26

Mục đích của watchlà hiển thị kết quả của toàn màn hình lệnh và cập nhật liên tục; nếu bạn đang chuyển hướng đầu ra thành một tệp và làm nền thì thực sự không có lý do gì để sử dụng đồng hồ ở nơi đầu tiên.

Nếu bạn muốn chạy lệnh nhiều lần với độ trễ ( watchchờ hai giây theo mặc định), bạn có thể sử dụng một cái gì đó như thế này:

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

Có cách nào để làm điều này trong một thời trang không chặn? Ví dụ: nếu tôi muốn đặt lệnh này và các lệnh khác trong một tập lệnh bash duy nhất và nó có tiếp tục chạy mã đi sau mã này không (trong khi vẫn thực hiện điều này trong nền)?
Austin

14

Đây là một cách:

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

Vì bạn làm nền cho quá trình, chúng tôi có thể cho rằng bạn không cần màn hình hiển thị đầu cuối và bạn sẽ chuyển hướng tốt đến một tệp. Nếu bạn làm điều đó bạn sẽ có thể nền watchmà không có vấn đề.

sleep, như đề xuất của Michael Mrozek, sẽ dần dần tụt hậu có thể là điều không mong muốn. Ngoài một tập lệnh shell phức tạp theo dõi thời gian hệ thống và thực thi một lệnh dựa trên thời gian đã trôi qua, watch -pcó thể là một lựa chọn tốt cho thời gian chính xác.

Đối với thời gian chính xác:

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

xin lỗi, cái này hoạt động thế nào Tại sao có thể chỉ sử dụng &hai lần?
phil294

Đọc phần đường ống man bashđể xem cách đầu tiên &hoạt động. ;)
Mioriin

11

Tôi không chắc chắn về động lực của bạn, nhưng có lẽ điều này là đủ?

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

Nếu không, hãy giải thích lý do tại sao bạn thực sự cần watch.


2

teelà bạn của bạn. Ví dụ: đây là cách bạn có thể hiển thị số lượng tệp trong thư mục hiện tại và nối nó vào Count.txt cứ sau 2 giây:

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

2

Phụ thuộc vào động lực của bạn:

  • Bạn muốn chạy một cái gì đó theo định kỳ. Sau đó, bạn có thể sử dụng cron trực tiếp. (Nếu độ chi tiết của thời gian là 1 phút là đủ cho mục đích của bạn).

    • Lưu ý: Nếu khoảng thời gian rất ngắn hoặc thiết bị rất hạn chế và trừ khi bạn định cấu hình nhật ký hệ thống để ghi nhật ký ít tin nhắn hơn từ crond, nó sẽ lấp đầy nhật ký hệ thống của bạn khá nhanh.
  • Bạn muốn chạy một cái gì đó liên tục:

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

    (Bạn có thể chạy cái này từ crontab chẳng hạn, mặc dù sử dụng tập lệnh rất được khuyến khích).

  • Bạn muốn chạy định kỳ một lệnh và có quyền truy cập vào đầu ra của lần thực hiện cuối cùng.

    • Bạn có thể viết đầu ra cho một ramfs (sửa đổi tập lệnh trước):

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

      hoặc thậm chí tốt hơn:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • Bạn có thể kết hợp screenwatch, để bạn luôn có thể kiểm tra trạng thái mới nhất, miễn là nó phù hợp với một màn hình:

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


0

Nếu bạn phải sử dụng watch- Chỉ cần kết hợp câu trả lời từ mike dangelol0b0

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

ví dụ

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

sau đó xem từng giây trôi qua

tail -f output.txt

0

Đồng hồ được thiết kế để xuất ra màn hình, nhưng đầu ra của nó có thể được chuyển hướng (cả thiết bị xuất chuẩn và thiết bị xuất chuẩn) sau đó nó sẽ chạy trong nền.

watch 'date >>fa' >/dev/null 2>/dev/null &
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.