Watchman: Execute a command when something changes
github.com
github.com
Advantages of Facebook’s watchman:
1. Implements efficient file system event watches on macOS and Windows
2. IPC/daemon system reduces resource use because overlapping watches/triggers don’t use more inotify slots.
3. Denounces / waits for changes to settle
4. Client libraries in a few different languages for scripting purposes
Oh, who am I kidding. Nobody, obviously.
https://pypi.org/project/watchdog/
https://github.com/gorakhargosh/watchdog
EDIT: Now I'm wondering how often I miss out on something because I confuse it for something I already use. Maybe there is room for a "things I use" or "things I know about" browser plugin.
> The Watchdog Timer in the PIC16F819 The watchdog timer can be a real source of pain and can also make a PIC system incredibly robust and reliable. But what exactly is the watchdog timer? Simply put, the watchdog timer is a hardware timer in the PIC that, if not constantly reset by the software, will cause the PIC to reset. This feature can be incredibly useful if the PIC should hang due to a hardware or software issue and guarantees that the PIC will restart from the beginning. Not only does it reset the system, it also flags a bit that can be used to determine if the system just crashed.
Ref: https://maker.pro/pic/tutorial/how-to-get-started-with-pic-m...
[1]: PIC microcontroller, is a small hardware simliar to arduino but more on a lower level.
> WARNING: This is a (possibly outdated and/or unmaintained) fork of https://github.com/eradman/entr .
Very composable as you just pipe its output to whatever you want (typically a while read do end), so exclusion is a awk/sed/perl/grep/rg away, and command can be as simple or complex as it needs to while the tool itself stays lean.
Cool features include -o to just be notified that something changed (e.g to fire up rsync), and ability to batch changes.
Also the command is a front end to libfswatch, so one can use that directly if shelling is to be foregone.
I can't find the PDF manual in the repo. Do I need to contact the author and say please?
For example:
dnf install inotify-tools
or
apt-get install inotify-tools[edit: fswatch looks very promising, and may be a better choice than either ifnotifywait or watchman]
Adding a new layer atop inotify tools doesn't make that package automatically run on new platforms. There are already tools on macos that use the native FSEvents API for watching for file changes and executing scripts.
The unique features in this over straight inotifywait is plugging together the command you want to execute, and some event dedupe logic. Grand majority of the code is around colorized logs, command docs, and some options handling code which mostly just gets piped to inotifywait.
test-watch:
make --no-print-directory test || :
fswatch --event Updated -o test/*.c test/*.h src/ | xargs -n1 -I{} make --no-print-directory testNot super useful, but not useless.
There are other much more popular tools that do the same thing, like entr, watchexec, and nodemon. Why is this posted?
I had not intention about gaining from folks accidentally landing on my project. Apologies if people felt mislead. I have no idea why this was suddenly posted on Hacker News yesterday.
(yes, one owns the other, but Facebook employees writing and releasing code for Facebook are on Facebook's payroll, not Meta's payroll)
Watchman not yet being branded with “Meta” is a case of laziness. It doesn’t indicate it’s limited to the Blue app.
It's mind-boggling that most systems don't have a standard tool for observing file changes. The only language I know of that has a platform-agnostic API for this is Factor.
It may not be installed by default, but inotifywait is available in common Linux distributions, usually in a package called something like ionotify-tools, and has been for over a decade-ana-half IIRC. It'll work under WSL on Windows too, though only for ext4 devices not bits of the Windows filesystem made available to Linux.
I can't speak to what other OSs include by default, but as every major OS has a different API for how to register a listener & how it gets messages no built-in tool is going to be cross-platform. There are third party tools which present more cross-platform consistency, most notably https://github.com/emcrisostomo/fswatch#readme (also available in common Linux distros, just an apt install away in Debian for instance).
I know not everybody uses Linux (or loves systemd as much as I do) but it's a great solution if you already use systemd.
[0] https://www.redhat.com/sysadmin/introduction-path-units
[1] https://www.freedesktop.org/software/systemd/man/systemd.pat...
Example .reflex.conf to run one command when an openapi spec changes and another when any go files change:
-g "spec.yaml" -- bash -c 'make'
-sr "\.go$" -- go run cmd/app/main.go
Then run it with: reflex -d fancy -c .reflex.confNeither init or a shell or any other userspace code. The userspace code like in inotifywait or incron just tells the kernel what it wants the kernel to watch, and then exits, gone, no further parent, not even init.
Ok now that I mentioned incron..., incron being a daemon is managed by init, but incron is not watching any files, not even it's own config files. incron just reads it's incrontab files and registers the desired events with the kernel, and then performs the desired actions when the kernel triggers it. It notices when it's own config files change the same way as any other inotify job, it asks the kernel to tell it when they change.
incron is like cron where you write a crontab-like file that specifies a command of your choosing. Pretty much the same as this thing minus some colorful display.
I guess the point of this thing would be if it provides a consistent wrapper interface over the various fs watching mechanisms on different OS's.
But for linux, I've already been using incron to do this job efficiently for ages.
However, this is a single bash script, which definitely could be stable and forgotten about. Something like this would be more appealing as a posix shell script, but if you're using bash anyway and not trying to distribute, then stable and simple goes a long way.
I also found this Cygwin mailing list post by Erik Blake: https://cygwin.com/pipermail/cygwin/2018-May/237069.html
And patches to make Cygwin support inotify_init() and friends implemented on top of the Windows native API are certainly welcome.
I think I just found my next personal project...https://github.com/Cyphrme/watch
{ "path_to_watch":"example_command_to_execute_on_change.sh", }
find /foo/bar -type f -mtime +1 | xargs foobar-exec foobar {} +
This was a project I did for my personal use case. But I haven't been using it since years. I'd recommend [entr](https://github.com/clibs/entr) for the use case watchman was to serve.
It recently reached 1 million downloads. The current maintainer, Alex Popov, is a very skilled developer working from Moscow.
[0] - https://www.man7.org/linux/man-pages/man1/inotifywait.1.html
https://github.com/e-dant/watcher
It hooks into system APIs where viable. (Otherwise, it uses std::filesystem.)
It’s meant to be as or more:
- Easy to use
- Efficient
Than all similar libraries.
Uses rust for performance, and is usable from the terminal or from python.
Can't this functionality be duplicated with a while loop and du?
while $(du -s file.log) < 200; do sleep 0; done; [some command here]I understand this is shell script territory, but a cross-platform tool would be ideal.
It’s been a few years, so perhaps it got addressed, but this library used to introduce a “memory leak” by design, by infinity storing pointers to files being watched.
It was a pain to isolate (https://techtldr.com/simple-guide-to-finding-a-javascript-me...)
Ultimately I ended up fixing it by writing my own version using native system calls available on Node.
The moral of the story, this library is great if you are building cross platform dev tool. It is not (at least wasn’t at the time) great for long lived processes that target only one type of operating system.
Do not use if your life depends on it.
The other fun part is that there is often a lag between the deletion and the create in the text editor case so it is necessary to defer triggering events when a deletion is detected and wait a little while to see if there is a corresponding creation. Otherwise you may rerun your command that depends on the file before it exists.
It is possible to get like a 99+% solution to this problem without polling but it is a lot harder than what these simple tools, including entr do. The upshot is that file monitoring should be looked at as a lowest common denominator solution. A better solution is to build automatic command running into the text editor itself.
You can ask the kernel to watch for several different specific kinds of fs events, either at the file or directory level.
Detecting when a file is either created, or closed from writing, is no problem at all. Ie, handles the case of writing a file normally, editing a file, and renaming a file into exitence without having opened it for writing (that happened while it had some other name you weren't watching). This would handle unlinking and recreating the same as editing or uploading.
You can watch specifically for the close event only, and even more specifically for close-from-write-mode to detect updates but ignore until the update is done. And at the same time you can also watch for creation, which handles creating a file under some other name and then renaming it into existence under the name you care about without the name you care about ever having a close-from-write event.
That would fire off your script when a filename you were watching was unlinked and re-created instead of edited in-place, and then it's up to your script to handle the case where it's a "new" file that is really just replacing an old file.
I don't even see why that should be any kind of special problem. Are some tools doing something like maintaining ooen file handles or something for every watched file??? That would break by unlink-create, but that would be insane.
Perhaps these wrappers that try to simplify things are as usual just a way to break the thing they are trying to simplify. Just misguided crap.
If the feature is baked into an ide or media server and failing to handle that case, well they don't have to fail to handle that case. The subsystem totally supplies the functionality.
For something random adhoc where you're writing your own incrontab and handler script, it's no problem at all.