Hi! I’m trying to build an rc.d(8) script for a service that does not daemonize on OpenBSD 7.6 stable amd64. (Actually the service is a Python script, Radicale 3.3.0 to be precise.)
Currently everything works but I’m getting a timeout from rcctl start. See section Questions below. Background: =========== There are ports for Radicale 1.x and 2.x. But unfortunately none for Radicale 3.x. One of the reasons might be that the -d option for Radicale no longer works? I.e. Radicale 3.x can not be made to daemonize. What I tried: ============= • Installed python and py3-pip ports. # pkg_add python py3-pip • I have installed Radicale 3.3.0 in a Python venv (to avoid mixing up pkg_add(1) and pip managed stuff) at /usr/local/lib/radicale. # python3 -m venv /usr/local/lib/radicale # /usr/local/lib/radicale/bin/pip install --upgrade pip # /usr/local/lib/radicale/bin/pip install radicale • I have created a _radicale user and group identical to the ones created in the radicale-2.1.12p7 port. • Created a minimal config in /etc/radicale/config specifying the storage path (/var/db/radicale/collections). Reason: the default path /var/lib/… does not exist on OpenBSD. • Created /var/db/radicale and set its owner and group to _radicale. • Created the following script and made it executable: # cat /etc/rc.d/radicale3 #!/bin/ksh daemon="/usr/local/lib/radicale/bin/radicale" daemon_user="_radicale" . /etc/rc.d/rc.subr pexp=".* ${daemon}.*" rc_reload=NO rc_configtest=NO rc_cmd $1 # Observations: ============= # rcctl -d start radicale3 doing _rc_parse_conf radicale3_flags empty, using default >< doing rc_check radicale3 doing rc_start doing _rc_wait_for_start doing rc_check No home directory /nonexistent! Logging in with home = "/". [2024-10-19 07:47:09 +0200] [43495] [INFO] Logging of backtrace is disabled in this loglevel [2024-10-19 07:47:09 +0200] [43495] [INFO] Logging of backtrace is disabled in this loglevel [2024-10-19 07:47:09 +0200] [43495] [INFO] Loaded default config [2024-10-19 07:47:09 +0200] [43495] [INFO] Loaded config file '/etc/radicale/config' [2024-10-19 07:47:09 +0200] [43495] [INFO] Skipped missing/unreadable config file '/.config/radicale/config' [2024-10-19 07:47:09 +0200] [43495] [INFO] Starting Radicale [2024-10-19 07:47:09 +0200] [43495] [WARNING] No user authentication is selected: '[auth] type=none' (insecure) [2024-10-19 07:47:09 +0200] [43495] [INFO] auth type is 'radicale.auth.none' [2024-10-19 07:47:09 +0200] [43495] [INFO] storage type is 'radicale.storage.multifilesystem' [2024-10-19 07:47:09 +0200] [43495] [INFO] rights type is 'radicale.rights.owner_only' [2024-10-19 07:47:09 +0200] [43495] [INFO] web type is 'radicale.web.internal' [2024-10-19 07:47:09 +0200] [43495] [INFO] hook type is 'radicale.hook.none' [2024-10-19 07:47:09 +0200] [43495] [INFO] permit delete of collection: True [2024-10-19 07:47:09 +0200] [43495] [INFO] permit overwrite of collection: True [2024-10-19 07:47:09 +0200] [43495] [INFO] Listening on '127.0.0.1:5232' [2024-10-19 07:47:09 +0200] [43495] [INFO] Listening on '[::1]:5232' [2024-10-19 07:47:09 +0200] [43495] [INFO] Radicale server ready doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check doing rc_check Alarm clock doing _rc_write_runfile (timeout) # # rcctl -d check radicale3 doing _rc_parse_conf radicale3_flags empty, using default >< doing _rc_parse_conf /var/run/rc.d/radicale3 radicale3 doing rc_check (ok) # The process is running, everything seems fine. Even `rcctl stop radicale3` works fine. `rcctl ls started` lists the service as started. `rcctl ls failed` does not list the service. Terminating the terminal session that started the service does not stop the service. So there seems to be nothing wrong. Questions: ========== 1) Why am I getting the repeated `doing rc_check` messages and the timeout when starting the service? (But the manual `rcctl check radicale3` works fine.) 2) How can I fix this to not generate a timeout? Note: I know I could shorten the time this happens by modifying daemon_timeout to less than the 30 second default. But I’d still get the timeout. 3) Do I perhaps need to create a wrapper that spawns the actual Radicale service and which returns a status of 0? And if so, are there any examples of something like this that I could look at for reference? Other: ====== I think I have looked at all of the relevant man pages and the FAQ. But I couldn’t find the answers there. I even tried to understand the rc.subr source code. But I’m not sure why the manual check works and the automated check in the loop when starting the service doesn’t. I have other similar situations in mind, where a long (infinitely) running script that does not daemonize should be started as a service. I’d like to find a general solution if possible. Thanks! Mike