OSError: [Errno 28] inotify watch limit reached

I am running python 3.11.7, fresh environment, streamlit version ‘1.40.1, Ubuntu 22.04 LTS’. All demo samples give error. It looks like a bug in code:

2024-11-15 13:48:50.633 Uncaught exception GET /_stcore/stream (127.0.0.1)
HTTPServerRequest(protocol=‘http’, host=‘localhost:8501’, method=‘GET’, uri=‘/_stcore/stream’, version=‘HTTP/1.1’, remote_ip=‘127.0.0.1’)
Traceback (most recent call last):
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/tornado/websocket.py”, line 938, in _accept_connection
open_result = handler.open(*handler.open_args, **handler.open_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/web/server/browser_websocket_handler.py”, line 126, in open
self._session_id = self._runtime.connect_session(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/runtime.py”, line 384, in connect_session
session_id = self._session_mgr.connect_session(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/websocket_session_manager.py”, line 99, in connect_session
session = AppSession(
^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/app_session.py”, line 133, in init
self._pages_manager = PagesManager(
^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/pages_manager.py”, line 236, in init
self.pages_strategy = PagesManager.DefaultStrategy(self, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/pages_manager.py”, line 74, in init
PagesStrategyV1.watch_pages_dir(pages_manager)
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/pages_manager.py”, line 62, in watch_pages_dir
watch_dir(
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/path_watcher.py”, line 155, in watch_dir
return _watch_path(
^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/path_watcher.py”, line 126, in _watch_path
watcher_class(
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/event_based_path_watcher.py”, line 107, in init
path_watcher.watch_path(
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/event_based_path_watcher.py”, line 185, in watch_path
folder_handler.watch = self._observer.schedule(
^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/api.py”, line 312, in schedule
emitter.start()
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/utils/init.py”, line 75, in start
self.on_thread_start()
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify.py”, line 119, in on_thread_start
self._inotify = InotifyBuffer(path, recursive=self.watch.is_recursive, event_mask=event_mask)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_buffer.py”, line 30, in init
self._inotify = Inotify(path, recursive=recursive, event_mask=event_mask)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_c.py”, line 185, in init
self._add_dir_watch(path, event_mask, recursive=recursive)
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_c.py”, line 411, in _add_dir_watch
self._add_watch(full_path, mask)
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_c.py”, line 424, in _add_watch
Inotify._raise_error()
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_c.py”, line 435, in _raise_error
raise OSError(errno.ENOSPC, “inotify watch limit reached”)
OSError: [Errno 28] inotify watch limit reached
Exception ignored in: <function AppSession.del at 0x77f64041efc0>
Traceback (most recent call last):
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/app_session.py”, line 174, in del
self.shutdown()
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/app_session.py”, line 240, in shutdown
if self._state != AppSessionState.SHUTDOWN_REQUESTED:
^^^^^^^^^^^
AttributeError: ‘AppSession’ object has no attribute ‘_state’
Exception in callback AppSession._on_scriptrunner_event..() at /home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/app_session.py:494
handle: <Handle AppSession._on_scriptrunner_event..() at /home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/app_session.py:494>
Traceback (most recent call last):
File “/home/tester/anaconda3/lib/python3.11/asyncio/events.py”, line 80, in _run
self._context.run(self._callback, *self._args)
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/app_session.py”, line 494, in
lambda: self._handle_scriptrunner_event_on_event_loop(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/runtime/app_session.py”, line 621, in _handle_scriptrunner_event_on_event_loop
self._local_sources_watcher.update_watched_modules()
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/local_sources_watcher.py”, line 177, in update_watched_modules
self._register_necessary_watchers(modules_paths)
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/local_sources_watcher.py”, line 183, in _register_necessary_watchers
self._register_watcher(str(Path(path).resolve()), name)
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/local_sources_watcher.py”, line 136, in _register_watcher
watcher=PathWatcher(filepath, self.on_file_changed),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/event_based_path_watcher.py”, line 107, in init
path_watcher.watch_path(
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/streamlit/watcher/event_based_path_watcher.py”, line 185, in watch_path
folder_handler.watch = self._observer.schedule(
^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/api.py”, line 312, in schedule
emitter.start()
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/utils/init.py”, line 75, in start
self.on_thread_start()
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify.py”, line 119, in on_thread_start
self._inotify = InotifyBuffer(path, recursive=self.watch.is_recursive, event_mask=event_mask)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_buffer.py”, line 30, in init
self._inotify = Inotify(path, recursive=recursive, event_mask=event_mask)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_c.py”, line 185, in init
self._add_dir_watch(path, event_mask, recursive=recursive)
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_c.py”, line 404, in _add_dir_watch
self._add_watch(path, mask)
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_c.py”, line 424, in _add_watch
Inotify._raise_error()
File “/home/tester/Streamlit/eagent/lib/python3.11/site-packages/watchdog/observers/inotify_c.py”, line 435, in _raise_error
raise OSError(errno.ENOSPC, “inotify watch limit reached”)
OSError: [Errno 28] inotify watch limit reached

The error “OSError: [Errno 28] inotify watch limit reached” occurs when the number of files or directories being monitored exceeds the system’s configured limit for inotify watches. This is common in applications like Streamlit or tools relying on file watching mechanisms like watchdog.

Try increasing the limit temporarily to check if the problem gets resolved.

sudo sysctl fs.inotify.max_user_watches=524288

You can replace 524288 with a higher value if necessary.

Thank you, I wonder why does it need to monitor so many files?