inotify (inode notify) is a Linux kernel subsystem created by John McCutchan, which monitors changes to the filesystem, and reports those changes to applications. It can be used to automatically update directory views, reload configuration files, log changes, backup, synchronize, and upload. The inotifywait and inotifywatch commands (maintained by Eric Curtin as part of the inotify-tools project) allow using the inotify subsystem from the command line. One major use is in desktop search utilities like Beagle, where its functionality permits reindexing of changed files without scanning the filesystem for changes every few minutes, which would be very inefficient.

inotify replaced an earlier facility, dnotify, which had similar goals. Inotify was merged into the Linux kernel mainline in kernel version 2.6.13, released on August 29, 2005; later kernel versions included further improvements.  The required library interfaces were added into the GNU C Library (glibc) in its version 2.4, released in March 2006, while the support for inotify was completed in glibc version 2.5, released in September 2006.

Limitations 
Limitations imposed by inotify include the following:

 Inotify does not support recursively watching directories, meaning that a separate inotify watch must be created for every subdirectory. In contrast, the command inotifywait does provide recursive watching of directories.
 Inotify does report some but not all events in sysfs and procfs.
 Notification via inotify requires the kernel to be aware of all relevant filesystem events, which is not always possible for networked filesystems such as NFS where changes made by one client are not immediately broadcast to other clients.
 Rename events are not handled directly; i.e., inotify issues two separate events that must be examined and matched in a context of potential race conditions.

History 
 July 2004: the first release announcement
 August 29, 2005: Linux kernel version 2.6.13 released, containing merged inotify code
 March 2006: GNU C Library (glibc) version 2.4 released, bringing initial inotify support
 September 2006: Glibc version 2.5 released, bringing complete inotify support

Advantages over dnotify 
There are a number of advantages when using inotify when compared to the older dnotify API that it replaced. With dnotify, a program had to use one file descriptor for each directory that it was monitoring. This can become a bottleneck since the limit of file descriptors per process could be reached. Later, fanotify was created to overcome this issue. The use of file descriptors along with dnotify also proved to be a problem when using removable media. Devices could not be unmounted since file descriptors kept the resource busy.

Another drawback of dnotify is the level of granularity, since programmers can only monitor changes at the directory level. To access detailed information about the environmental changes that occur when a notification message is sent, a stat structure must be used; this is considered a necessary evil in that a cache of stat structures has to be maintained, for every new stat structure generated a comparison is run against the cached one.

The inotify API uses fewer file descriptors, allowing programmers to use the established select and poll interface, rather than the signal notification system used by dnotify. This also makes integration with existing select- or poll-based libraries (like GLib) easier.

See also 

 File Alteration Monitor (SGI)
 DMAPI
 kqueue (FreeBSD, NetBSD, OpenBSD, DragonFly BSD, and macOS)
 FSEvents (macOS)
 entr (https://github.com/eradman/entr) (https://eradman.com/entrproject/)

References

External links 
 Kernel Korner  an introduction to inotify by Robert Love (2005)
 LWN Article on Inotify watching filesystem events with inotify (partly out of date)
 IBM Article monitoring Linux filesystem events with inotify (6 September 2008).
 Filesystem notification, part 1: An overview of dnotify and inotify an LWN.net article by Michael Kerrisk (2014)

Linux kernel features
inotify는 파일 시스템 이벤트 통보 기능을 제공해 주는 리눅스 커널 서브시스템 중 하나이다. inotify는 존 맥컷챈()이 개발하였는데, 로버트 러브(Robert Love) 및 뒤이어 애이미 그리피스(Amy Griffis)의 도움을 받았다. dnotify를 대체한다. inotify는 메인라인 커널에 2.6.13 버전부터 포함되었다. 그 전에도 소프트웨어 패치를 통해서 사용이 가능하였다. inotify는 파일 시스템의 변경 사항을 알아내고, 커널에 의해 직접 응용 프로그램에 이러한 변경 사항들을 보고하기 위한 것이다.

Inotify는 비이글과 같은 데스크톱 검색 유틸리티에 자주 이용된다. inotify를 쓰면, 파일 시스템의 변경을 탐지하기 위하여 일정 주기마다 반복하여 파일 시스템을 탐색할 필요가 없이 변경된 파일들을 리인덱싱 할 수 있으며, 그 덕분에 프로그램은 짧은 시간의 "변경부터 리인덱싱까지의 시간"()을 가질 수 있다. inotify는 그러한 유틸리티들로 하여금 비교적 적은 CPU 시간만을 사용하도록 해주며, 결국 inotify는 이러한 프로그램들로 하여금 훨씬 효율적인 방식을 사용할 수 있도록 해 준다. 

inotify는 또한 파일 탐색기와 같이 디렉터리 목록을 자동적으로 갱신하는 일에 쓰일 수 있다. 또한 설정 파일을 다시 읽어 들이는 일이나, 로그 변경, 백업, 동기화, 업로드 같은 일에 쓰일 수 있다.

장점 
Inotify는 앞서 개발된 dnotify에 비해 많은 장점을 가지고 있다. dnotify를 가지고서는 프로그램은 모니터링하는 각각의 디렉터리에 대해서 각각 하나씩의 파일 서술자를 사용했어야만 했다. 이 경우, 프로세스 당 파일 서술자의 개수가 한계에 다다를 수 있고, 또 그렇게 되면 일종의 병목 (bottleneck)이 되기 때문에 이것은 좋은 방법이 아니었다. dnotify는 제거 가능한 미디어(removable media)의 파일에 사용할 때에도 문제가 되었다. 파일 서술자 때문에 장치가 사용중(busy)인 상태가 되었으므로 장치가 해제(un-mount)될 수 없었다.

dnotify의 다른 단점은, 모니터(monitor)를 디렉터리 단위에서만 변경 가능하기 때문에, 세세한 제어가 불가능했다는 점이다. 프로그래머들은 Dnotify로부터 통지(notification)를 받았을 때, 무슨 일이 일어났는지 정확히 알기 위해서는 스태트(stat) 함수를 이용하고, 그 결과의 캐시를 유지해야만 했으며, 디렉터리 안의 어떤 파일에서 변경이 일어났을 경우 새로운 스태트(stat) 스트럭쳐를 생성하고는 그것을 이미 캐시된 것과 비교해야만 했다.

inotify는 최소한의 파일 서술자만 사용하는 API를 쓰고 있다. 프로그래머들은 이미 널리 쓰이고 있는 select 및 poll 인터페이스를 이용하여 이를 사용할 수 있다. 이는 시그널 통지 방식을 채용하였던 dnotify와 상반된다. 이 덕분에 기존의 select나 poll 기반 라이브러리(예. Glib)와의 통합이 쉬워졌다.

동작 방법 

inotify는 inotify를 위해 특별히 고안된 일련의 시스템 콜을 이용하여 이용할 수 있다.

inotify 인스턴스를 생성한다. 모든 이벤트를 읽어낼 수 있는 파일 서술자 하나를 반환한다.

pathname이 가리키는 inode에 대한 감시(watching)을 시작한다. mask에 포함된 이벤트에 대한 감시이다. (inotify 인스턴스 내에서) pathname이 가리키는 inode에 대해 고유한 감시 서술자(watch decriptor) 하나를 반환해준다. (참조: 여러 개의 pathname들이 동일한 inode/watch descriptor를 가리킬 수 있다.)

주어진 감시 서술자 wd에 대한 감시를 중단한다.

inotify가 올려주는 이벤트에는 다음과 같은 정보가 들어 있다:

모니터될 수 있는 이벤트들은 예를 들어 다음과 같다:
 IN_ACCESS - 파일의 마지막 접근
 IN_MODIFY - 파일의 마지막 수정
 IN_ATTRIB - 파일 속성의 변경
 IN_OPEN 및 IN_CLOSE - 파일의 열기 혹은 닫기
 IN_MOVED_FROM 및 IN_MOVED_TO - 파일이 이동(move)되거나 이름이 바뀜(rename)
 IN_DELETE - 파일/디렉터리의 삭제
 IN_CREATE - 파일/디렉터리의 생성
 IN_DELETE_SELF - 모니터되는 파일 자체의 삭제

역사 
 2005년 8월 - 2.6.13에 합병.
 2004년 7월 - 최초의 릴리즈 발표

같이 보기 
 File alteration monitor
 Gamin

외부 링크 
  inotify-tools A suite of userland utilities, based on inotify, to watch and log modifications on files and directories
  Official inotify README
  Kernel Korner   - Intro to inotify by Robert Love (2005)
  LWN Article on Inotify Watching filesystem events with inotify (partly out of date)
  IBM Article Monitor Linux file system events with inotify (out of date)
  incron An inotify cron system. It works like a regular cron but handles filesystem events rather than time periods.

프로그래밍 API 
 inotify-cxx C++
 Linux::Inotify2 perl
 Pyinotify python
 JNotify java
 Ocaml Inotify Ocaml

리눅스