I'm repeatedly getting an error from nyx running under Ubuntu 18.04. It's fine on first run after a reboot. After a while, the terminal it's in shows a chaotic and frozen pattern. Quitting out and restarting, produces the error below, which ends in:

sqlite3.OperationalError: attempt to write a readonly database

The problem appears to be ~/.nyx/cache.sqlite, which is owned by root and which nyx is trying to write on startup/shutdown. I tried changing permissions from 644 to 664, and then even 666, but that didn't help. On the other hand, changing ownership to myself did help. Is this a security risk? Why didn't 666, which should have given everyone write permission, work?

Traceback (most recent call last): File "/usr/bin/nyx", line 11, in <module> load_entry_point('nyx==2.0.4', 'console_scripts', 'nyx')() File "/usr/lib/python3/dist-packages/nyx/__init__.py", line 176, in main nyx.starter.main() File "/usr/lib/python3/dist-packages/stem/util/conf.py", line 289, in wrapped return func(*args, config = config, **kwargs) File "/usr/lib/python3/dist-packages/nyx/starter.py", line 118, in main nyx.curses.start(nyx.draw_loop, acs_support = config.get('acs_support', True), transparent_background = True, cursor = False) File "/usr/lib/python3/dist-packages/nyx/curses.py", line 217, in start curses.wrapper(_wrapper) File "/usr/lib/python3.6/curses/__init__.py", line 94, in wrapper return func(stdscr, *args, **kwds) File "/usr/lib/python3/dist-packages/nyx/curses.py", line 215, in _wrapper function() File "/usr/lib/python3/dist-packages/nyx/__init__.py", line 194, in draw_loop interface = nyx_interface() File "/usr/lib/python3/dist-packages/nyx/__init__.py", line 256, in nyx_interface Interface() # constructor sets NYX_INTERFACE File "/usr/lib/python3/dist-packages/nyx/__init__.py", line 589, in __init__ self._header_panel = nyx.panel.header.HeaderPanel() File "/usr/lib/python3/dist-packages/nyx/panel/header.py", line 47, in __init__ self._vals = Sampling.create() File "/usr/lib/python3/dist-packages/nyx/panel/header.py", line 235, in create my_router_status_entry = nyx.tracker.get_consensus_tracker().my_router_status_entry() File "/usr/lib/python3/dist-packages/nyx/tracker.py", line 169, in get_consensus_tracker CONSENSUS_TRACKER = ConsensusTracker() File "/usr/lib/python3/dist-packages/nyx/tracker.py", line 831, in __init__ self._update(ns_response) File "/usr/lib/python3/dist-packages/nyx/tracker.py", line 853, in _update writer.record_relay(fingerprint, address, or_port, nickname) File "/usr/lib/python3/dist-packages/nyx/__init__.py", line 569, in record_relay self._cache._query('INSERT OR REPLACE INTO relays(fingerprint, address, or_port, nickname) VALUES (?,?,?,?)', fingerprint, address, or_port, nickname) File "/usr/lib/python3/dist-packages/nyx/__init__.py", line 541, in _query return self._conn.execute(query, param) sqlite3.OperationalError: attempt to write a readonly database

2 Answers 2


This is a bug which has been reported.

I do not know if my work-around was a security risk, but the solution that they offer on the bug tracker is:

Users should be able to work around this with the following... % echo "data_directory disabled" >> my_nyxrc % nyx --config my_nyxrc


Changing the owner of the config directory to the current user and group fixed the error for me:
sudo chown $(id -u):$(id -g) -R ~/.nyx

On the first run (on Ubuntu 18.04) I started nyx logged in as a regular user with sudo nyx. A notice was shown: Nyx is currently running with root permissions. This isn't a good idea, nor should it be necessary. While nyx ran normally, it created its config directory ~/.nyx (containing the SQLite database) owned by root:root. Later, I started nyx again as a regular user and it crashed with the error: sqlite3.OperationalError: attempt to write a readonly database.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .