Cách chạy lệnh trên File hoặc Directory changes với Incron trên Ubuntu 16.04

theanh

Administrator
Nhân viên
Hướng dẫn này chỉ cho bạn cách sử dụngincron trên hệ thống Ubuntu 16.04 (Xenial Xerus) để chạy lệnh khi tệp hoặc thư mục bị thay đổi. Daemon 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 Cài đặt Incron​

Các bước sau phải được chạy với tư cách là người dùng root. Vui lòng đăng nhập vào shell của hệ thống Ubuntu và trở thành root bằng:
Mã:
sudo -s
Phần mềm Incron có sẵn trong kho lưu trữ Ubuntu. Do đó, tôi sẽ cài đặt nó bằng apt như thế này:
Mã:
apt-get -y install incron



3 Cách sử dụng Incron​

Như đã đề cập trong chương đầu tiên, Incron có nhiều điểm tương đồng với công cụ Cron. Trong khi Cron có lệnh crontab để quản lý cronjob, Incron có lệnh incrontab. Bạn có thể sử dụng danh sách tùy chọn lệnh incrontab (-l), chỉnh sửa (-e) và xóa (-r) để hiển thị và thay đổi các mục incrontab.

Chạy lệnh sau để có cái nhìn tổng quan đầy đủ về incrontab:
Mã:
man incrontab
Trong trang hướng dẫn, bạn sẽ tìm thấy ghi chú sau:

Nếu /etc/incron.allow tồn tại, 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, 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ố này tồn tại, 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 (không an toàn)...
Mã:
rm -f /etc/incron.allow
... hoặc chúng ta thêm người dùng root vào tệp incron.allow (đây là tùy chọn được khuyến nghị). Mở tệp /etc/incron.allow:
Mã:
nano/etc/incron.allow
Và thêm dòng sau.
Mã:
root
Trước khi thực hiện, 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
server1:~#
Sau đó, nó hoạt động:
Mã:
server1:~# incrontab -l
no table for root
server1:~#
Bây giờ chúng ta có thể sử dụng lệnh này:
Mã:
incrontab -e
Để tạo các tác vụ incron. Bây giờ chúng ta hãy xem xét kỹ hơn trang hướng dẫn để hiểu Cú pháp.
Mã:
man 5 incrontab
manpage hiển thị định dạng của các dòng tab cron. Định dạng tuân theo sơ đồ này:
Mã:
...trong đó <path>là một thư mục hoặc một tệp. Xin lưu ý rằng incronis không thể theo dõi các tệp trong các thư mục con của thư mục mà bạn đã đặt, vì vậy chỉ các tệp trong thư mục đó mới được theo dõi.

<mask> có thể là một trong các tùy chọn 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_FOLLOWĐừng tham chiếutênđườngdẫnnếulàliênkếttượngtrưng
IN_ONESHOTMonitortênđườngdẫnchỉchomộtsựkiện
IN_ONLYDIRChỉxemtênđườngdẫnnếulàthưmục
Ngoài ra, có một biểu tượng không xuất hiện trong bộ biểu tượng inotify. Đó là IN_NO_LOOP. Biểu tượng 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 cần chạy khi sự kiện xảy ra. Các ký tự đại diện sau đây có thể được sử dụng bên trong đặc 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ì $@ chứa đường dẫn thư mục và $# chứa 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 các ký tự đại diện nhưng không chắc chúng dịch thành gì, bạn có thể tạo một tác vụ incron như thế này.

Tạo một thư mục sẽ được theo dõi:
Mã:
mkdir /tmp/testdir
Sau đó, mở incrontab:
Mã:
incrontab -e
và thêm dòng sau:
Mã:
/tmp/testdir/ IN_MODIFY echo "$$ $@ $# $% $&"
Sau đó, bạn tạo hoặc sửa đổi một tệp trong thư mục /tmp/testdir/ và xem /var/log/syslog - nhật ký này hiển thị khi công việc incron đã được kích hoạt, nếu nó thành công hoặc có lỗi, và lệnh thực tế mà nó 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).

Để thử nghiệm, tôi sẽ thêm hai tệp, helloworld.txt và helloworld2.txt trong /tmp/testdir/ bằng lệnh echo:
Mã:
echo 'Bạn khỏe không?' > /tmp/testdir/helloworld.txt
echo 'Bạn khỏe không?' > /tmp/testdir/helloworld2.txt
Vậy hãy kiểm tra syslogwith tail để tìm ecents incron:
Mã:
tail /var/log/syslog
Mã:
...
12/04 18:49:22 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld.txt IN_MODIFY 2")
12/04 18:50:31 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld2.txt IN_MODIFY 2")
Bây giờ là đủ 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ụ inincron 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
server1:~#
Để 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'
bảng cho người dùng 'root' đã được xóa thành công
server1:~#

4Liên kết​

 
Back
Bên trên