Lệnh watch - Chạy lặp lại lệnh Linux theo chu kỳ

Một người quản trị hệ thống thường phải chạy một lệnh một cách lặp lại trong một khoảng thời gian nhất định. Thông thường, những nhiệm vụ như vậy có thể được hoàn thành dễ dàng với các lệnh cron đơn giản. Trong hầu hết các trường hợp, điều này sẽ hoạt động, nhưng khoảng thời gian ngắn nhất mà bạn có thể chạy lệnh cron là mỗi 1 phút. Tin hay không, trong nhiều trường hợp, điều này chậm quá đấy.

Chạy lệnh Linux Mỗi Giây

Trong bài viết này, bạn sẽ tìm hiểu về các kỹ thuật viết script đơn giản để giám sát hoặc theo dõi một lệnh cụ thể trong trạng thái chạy liên tục tương tự như lệnh top (theo dõi liên tục tiến trình và sử dụng bộ nhớ) mỗi 3 giây mặc định.

Chúng ta sẽ không dừng lại để thảo luận về lý do tại sao bạn cần chạy lệnh này với tần số như vậy. Tôi tin rằng mỗi người có lý do khác nhau về việc làm điều này trong công việc hàng ngày hoặc thậm chí trên các máy tính cá nhân và laptop ở nhà.

1. Sử dụng lệnh watch

Watch là một lệnh Linux cho phép bạn thực thi một lệnh hoặc chương trình theo chu kỳ và cũng hiển thị kết quả trên màn hình. Điều này có nghĩa là bạn sẽ có thể nhìn thấy kết quả của chương trình kịp thời. Mặc định, watch chạy lại lệnh/chương trình sau mỗi 2 giây. Khoảng thời gian có thể dễ dàng thay đổi để đáp ứng yêu cầu của bạn.

Giám sát việc sử dụng bộ nhớ

"Watch" rất dễ sử dụng, để kiểm tra, bạn có thể bật cửa sổ terminal Linux ngay lập tức và gõ lệnh sau:

# watch free -m

Lệnh trên sẽ kiểm tra bộ nhớ trống của hệ thống và cập nhật kết quả của lệnh free sau mỗi hai giây.

Giám sát việc sử dụng bộ nhớ trong Linux

Như bạn thấy từ kết quả trên, bạn có một tiêu đề, hiển thị thông tin về (từ trái sang phải) khoảng thời gian cập nhật, lệnh đang được thực thi và thời gian hiện tại. Nếu bạn muốn ẩn tiêu đề này, bạn có thể sử dụng tùy chọn -t.

Câu hỏi tiếp theo là – làm thế nào để thay đổi khoảng thời gian thực thi. Với mục đích đó, bạn có thể sử dụng tùy chọn -n, xác định khoảng thời gian mà lệnh sẽ được thực thi. Khoảng thời gian này được xác định bằng giây. Vì vậy, giả sử bạn muốn chạy tập tin script.sh của mình mỗi 10 giây, bạn có thể làm như sau:

# watch -n 10 script.sh

Lưu ý rằng nếu bạn chạy lệnh như hình trên, bạn cần cd đến thư mục (tìm hiểu 15 ví dụ lệnh cd) nơi tập tin script đặt hoặc chỉ định đường dẫn đầy đủ đến tập tin đó.

Các tùy chọn hữu ích khác của lệnh watch là:

  1. -b – tạo ra âm thanh bíp nếu kết quả của lệnh là khác không.
  2. -c – Hiểu các chuỗi màu ANSI.
  3. -d – làm nổi bật các thay đổi trong kết quả của lệnh.

Giám sát người dùng đăng nhập, thời gian hoạt động của máy chủ và trung bình tải

Giả sử bạn muốn giám sát người dùng đăng nhập, thời gian hoạt động của máy chủ và kết quả trung bình về tải liên tục trong một vài giây, sau đó sử dụng lệnh sau:

# watch uptime
Xem trung bình tải Linux

Để thoát lệnh, nhấn CTRL+C.

Ở đây, lệnh 'uptime' sẽ chạy và hiển thị kết quả cập nhật sau mỗi 2 giây mặc định.

Giám sát quá trình sao chép

Trong Linux, khi sao chép tệp từ một vị trí khác sang một vị trí khác bằng lệnh cp, tiến trình sao chép không hiển thị tiến trình dữ liệu. Để xem tiến trình sao chép, bạn có thể sử dụng lệnh watch kết hợp với lệnh du -s để kiểm tra việc sử dụng đĩa trong thời gian thực.

# cp ubuntu-15.10-desktop-amd64.iso /home/tecmint/ &
# watch -n 0.1 du -s /home/tecmint/ubuntu-15.10-desktop-amd64.iso 
Giám sát tiến trình sao chép lệnh

Nếu bạn nghĩ rằng quy trình trên quá phức tạp để thực hiện, thì tôi gợi ý bạn nên sử dụng lệnh copy nâng cao, hiển thị tiến trình sao chép dữ liệu.

2. Sử dụng lệnh sleep

sleep thường được sử dụng để gỡ lỗi các kịch bản shell, nhưng nó cũng có nhiều mục đích hữu ích khác. Ví dụ, khi kết hợp với vòng lặp for hoặc while, bạn có thể có kết quả tuyệt vời.

Nếu bạn mới làm quen với viết script bash, bạn có thể kiểm tra hướng dẫn của chúng tôi về vòng lặp bash tại đây.

Nếu đây là lần đầu tiên bạn nghe về lệnh "sleep", nó được sử dụng để trễ lại một khoảng thời gian cụ thể. Trong các script, bạn có thể sử dụng nó để cho script của bạn thực thi lệnh 1, đợi 10 giây và sau đó thực thi lệnh 2.

Với những vòng lặp trên, bạn có thể cho bash thực thi một lệnh, trì hoãn trong N giây và sau đó thực thi lệnh một lần nữa.

Dưới đây là ví dụ về cả hai loại vòng lặp:

Ví dụ vòng lặp for

# for i in {1..10}; do echo -n "This is a test in loop $i "; date ; sleep 5; done

Một dòng lệnh trên sẽ thực thi lệnh echo và hiển thị ngày hiện tại, tổng cộng 10 lần, với khoảng cách 5 giây chờ giữa các lần thực thi.

Dưới đây là kết quả mẫu:

This is a test in loop 1 Wed Feb 17 20:49:47 EET 2016
This is a test in loop 2 Wed Feb 17 20:49:52 EET 2016
This is a test in loop 3 Wed Feb 17 20:49:57 EET 2016
This is a test in loop 4 Wed Feb 17 20:50:02 EET 2016
This is a test in loop 5 Wed Feb 17 20:50:07 EET 2016
This is a test in loop 6 Wed Feb 17 20:50:12 EET 2016
This is a test in loop 7 Wed Feb 17 20:50:17 EET 2016
This is a test in loop 8 Wed Feb 17 20:50:22 EET 2016
This is a test in loop 9 Wed Feb 17 20:50:27 EET 2016
This is a test in loop 10 Wed Feb 17 20:50:32 EET 2016

Bạn có thể thay đổi các lệnh echo và date bằng các lệnh hoặc kịch bản của riêng bạn và thay đổi khoảng thời gian chờ theo nhu cầu của bạn.

Ví dụ vòng lặp while

# while true; do echo -n "This is a test of while loop";date ; sleep 5; done

Dưới đây là kết quả mẫu:

This is a test of while loopWed Feb 17 20:52:32 EET 2016
This is a test of while loopWed Feb 17 20:52:37 EET 2016
This is a test of while loopWed Feb 17 20:52:42 EET 2016
This is a test of while loopWed Feb 17 20:52:47 EET 2016
This is a test of while loopWed Feb 17 20:52:52 EET 2016
This is a test of while loopWed Feb 17 20:52:57 EET 2016

Lệnh trên sẽ chạy cho đến khi nó bị kết thúc hoặc bị ngắt bởi người dùng. Nó có thể hữu ích nếu bạn cần chạy một lệnh trong nền và bạn không muốn phụ thuộc vào cron.

Quan trọng: Khi sử dụng các phương pháp trên, rất khuyến nghị bạn đặt khoảng thời gian đủ dài để cho lệnh của bạn kịp thời chạy xong trước khi thực hiện lần thực thi tiếp theo.

Kết luận

Các mẫu trong bài viết này hữu ích, nhưng không thay thế hoàn toàn tiện ích cron. Việc tìm ra phương pháp nào hoạt động tốt hơn cho bạn nằm trong tầm tay của bạn, nhưng nếu chúng ta phải phân chia việc sử dụng hai kỹ thuật này, tôi sẽ nói rằng:

  1. Sử dụng cron khi bạn cần chạy lệnh định kỳ ngay cả sau khi hệ thống khởi động lại.
  2. Sử dụng các phương pháp được giải thích trong bài viết này cho các chương trình/script có ý định chạy trong phiên người dùng hiện tại.

Như luôn luôn, nếu bạn có bất kỳ câu hỏi hoặc ý kiến nào, đừng ngần ngại gửi chúng trong phần bình luận phía dưới.