Cách kích hoạt lệnh trên File/Directory thay đổi với Incron trên Debian

theanh

Administrator
Nhân viên
Hướng dẫn này chỉ cho bạn cách cài đặt và sử dụng incron trên hệ thống Debian 9 (Stretch). Incron tương tự như cron, nhưng thay vì chạy lệnh dựa trên thời gian, nó có thể kích hoạt lệnh khi sự kiện tệp hoặc thư mục xảy ra (ví dụ: sửa đổi tệp, thay đổi quyền, v.v.).

1 Điều kiện tiên quyết​

  • Quyền quản trị viên hệ thống (đăng nhập root). Tất cả các lệnh trong hướng dẫn này phải được chạy dưới dạng người dùng root trên shell.
  • Tôi sẽ sử dụng trình soạn thảo "nano" để chỉnh sửa tệp. Bạn có thể thay nano bằng trình soạn thảo tùy chọn hoặc cài đặt nano bằng "apt-get install nano" nếu nó chưa được cài đặt trên máy chủ của bạn.

2Cài đặt Incron​

Incron có sẵn trong kho lưu trữ Debian, vì vậy chúng tôi cài đặt incron bằng lệnh apt sau:
Mã:
apt-get install incron
Quá trình cài đặt sẽ tương tự như trong ảnh chụp màn hình này.


3Sử dụng​

Cách sử dụng Incron rất giống với cách sử dụng cron. Bạn có lệnh incrontab cho phép bạn liệt kê (-l), chỉnh sửa (-e) và xóa (-r) các mục incrontab.

Để tìm hiểu thêm về lệnh này, hãy xem:
Mã:
man incrontab
Bạn cũng sẽ tìm thấy phần sau:

Nếu /etc/incron.allow tồn tại thì chỉ những người dùng được liệt kê ở đây mới có thể sử dụng incron. Ngược lại, nếu /etc/incron.deny tồn tại thì chỉ những người dùng KHÔNG được liệt kê ở đây mới có thể sử dụng incron. Nếu không có tệp nào trong số các tệp này tồn tại thì mọi người đều được phép sử dụng incron. (Lưu ý quan trọng: Hành vi này không an toàn và có thể sẽ được thay đổi để tương thích với kiểu được sử dụng bởi ISC Cron.) Vị trí của các tệp này có thể được thay đổi trong cấu hình.

Điều này có nghĩa là nếu chúng ta muốn sử dụng incrontab với tư cách là root, chúng ta phải xóa /etc/incron.allow (điều này không an toàn vì sau đó mọi người dùng hệ thống đều có thể sử dụng incrontab)...
Mã:
rm -f /etc/incron.allow
... hoặc thêm root vào tệp đó (được khuyến nghị). Mở tệp /etc/incron.allow bằng nano:
Mã:
nano/etc/incron.allow
Và thêm dòng sau. Sau đó lưu tệp.
Mã:
root
Trước khi thực hiện thao tác này, bạn sẽ nhận được thông báo lỗi như thế này khi cố gắng sử dụng incrontab:
Mã:
server1:~# incrontab -l
user 'root' is not allowed to use incron
Sau đó, nó hoạt động:
Mã:
server1:~# incrontab -l
no table for root
Chúng ta có thể sử dụng lệnh:
Mã:
incrontab -e
Để tạo các tác vụ incron. Trước khi thực hiện thao tác này, chúng ta hãy xem trang hướng dẫn incron:
Mã:
man 5 incrontab
Trang hướng dẫn giải thích định dạng của crontab. Về cơ bản, định dạng như sau...
Mã:
...trong đó <path> có thể là một thư mục (có nghĩa là thư mục và/hoặc các tệp trực tiếp trong thư mục đó (không phải các tệp trong thư mục con của thư mục đó!) được theo dõi) hoặc một tệp.

<mask> có thể là một trong những mục sau:
Mã:
IN_ACCESSFilewasaccessed(read)(*)
IN_ATTRIBMetadatachanged(permissions, timestamps,extendedattributes,etc.)(*)
IN_CLOSE_WRITEFileopenedforwritingwasclosed(*)
IN_CLOSE_NOWRITEFilenotopenedforwritingwasclosed(*)
IN_CREATEFile/directorycreatedinwatcheddirectory(*)
IN_DELETEFile/dire ctorydeletedfromwatcheddirectory(*)
IN_DELETE_SELFWatchedfile/directorywasitselfdeleted
IN_MODIFYFilewasmodified(*)
IN_MOVE_SELFWatchedfile/directorywasitselfmoved
IN_MOVED_FROMFilemovedoutofwatcheddirectory(*)
IN_MOVED_TOFilemovedintowatcheddirectory(*)
IN_OPENFilewasopened(*)
Khi giám sát một thư mục, các sự kiện được đánh dấu bằng dấu hoa thị (*) ở trên có thể xảy ra đối với các tệp trong thư mục, trong trường hợp đó, trường tên trong
dữ liệu sự kiện được trả về sẽ xác định tên của tệp trong thư mục.

Biểu tượng IN_ALL_EVENTS được định nghĩa là mặt nạ bit của tất cả các sự kiện ở trên. Hai ký hiệu tiện lợi bổ sung là IN_MOVE, là sự kết hợp của IN_MOVED_FROM và IN_MOVED_TO, và IN_CLOSE kết hợp IN_CLOSE_WRITE và IN_CLOSE_NOWRITE.

Các ký hiệu sau đây có thể được chỉ định trong mặt nạ:
Mã:
IN_DONT_FOLLOWDon'tdereferencepathnameifitisasymboliclink
IN_ONESHOTMonitorpathnameforonlyoneevent
IN_ONLYDIROnlywatchpathnameifitisadirectory
Ngoài ra, có một ký hiệu không xuất hiện trong bộ ký hiệu inotify. Đó là IN_NO_LOOP. Ký hiệu này vô hiệu hóa các sự kiện giám sát cho đến khi sự kiện hiện tại được xử lý hoàn toàn (cho đến khi tiến trình con của nó thoát).

<command> là lệnh sẽ được chạy khi sự kiện xảy ra. Các ký tự đại diện sau có thể được sử dụng bên trong thông số kỹ thuật lệnh:
Mã:
$$dollarsign
$@watchedfilesystempath(seeabove)
$#event-relatedfilename
$%eventflags(textually)
$&eventflags(numerically)
Nếu bạn theo dõi một thư mục, thì $@ giữ đường dẫn thư mục và $# giữ tệp đã kích hoạt sự kiện. Nếu bạn theo dõi một tệp, thì $@ chứa đường dẫn đầy đủ đến tệp và $# để trống.

Nếu bạn cần ký tự đại diện nhưng không chắc chúng có nghĩa là gì, bạn có thể tạo tác vụ incron như thế này. Mở incron incrontab:
Mã:
incrontab -e
và thêm dòng sau:
Mã:
/tmp/ IN_MODIFY echo "$$ $@ $# $% $&"
Sau đó, bạn tạo hoặc sửa đổi tệp trong thư mục /tmp và xem /var/log/syslog - nhật ký này hiển thị thời điểm tác vụ incron được kích hoạt, nếu tác vụ thành công hoặc có lỗi và lệnh thực tế mà tác vụ này thực thi là gì (tức là các ký tự đại diện được thay thế bằng giá trị thực của chúng).
Mã:
tail /var/log/syslog
Mã:
...
10 tháng 1 13:52:35 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
10 tháng 1 13:52:36 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
10 tháng 1 13:52:39 server1 incrond[1012]: (root) CMD (echo "$ /tmp hello.txt IN_MODIFY 2")
10 tháng 1 13:52:39 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Trong ví dụ này, tôi đã chỉnh sửa tệp /tmp/hello.txt; như bạn thấy $@ dịch thành /tmp, $# thành hello.txt, $% thành IN_CREATE và $& thành 256. Tôi đã sử dụng một trình soạn thảo tạo tệp .txt.swp tạm thời dẫn đến các dòng bổ sung trong syslog.

Bây giờ lý thuyết đã đủ rồi. Hãy tạo các tác vụ incron đầu tiên của chúng ta. Tôi muốn theo dõi tệp /etc/apache2/apache2.conf và thư mục /etc/apache2/vhosts/, và bất cứ khi nào có thay đổi, tôi muốn incron khởi động lại Apache. Đây là cách chúng tôi thực hiện:
Mã:
incrontab -e
Mã:
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart/etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restart
Vậy là xong. Đối với mục đích thử nghiệm, bạn có thể sửa đổi cấu hình Apache của mình và xem /var/log/syslog, và bạn sẽ thấy incron khởi động lại Apache.

LƯU Ý: Không thực hiện bất kỳ hành động nào từ bên trong tác vụ incron trong thư mục mà bạn theo dõi để tránh vòng lặp. Ví dụ:Khi bạn theo dõi thư mục /tmp để tìm các thay đổi và mỗi thay đổi kích hoạt một tập lệnh ghi tệp nhật ký vào /tmp, điều này sẽ gây ra vòng lặp và có thể khiến hệ thống của bạn phải chịu tải cao hoặc thậm chí làm hệ thống bị sập.

Để liệt kê tất cả các tác vụ incron đã xác định, bạn có thể chạy:
Mã:
incrontab -l
Mã:
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /usr/sbin/service apache2 restart
Để xóa tất cả các tác vụ incron của người dùng hiện tại, hãy chạy:
Mã:
incrontab -r
Mã:
server1:~# incrontab -r
removing table for user 'root'
table for người dùng 'root' đã xóa thành công

4Liên kết​

 
Back
Bên trên