On Sat, Oct 19, 2024 at 02:43:01PM +0200, Mike Fischer wrote: > 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
Missing rc_bg=YES maybe? > > 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 > -- Antoine