Hi Michael,

Am 05.09.2025 um 22:01 schrieb Michael Osipov:
Instruct the RC system to do a "su - ...", and then daemon(8) tries to drop privs. It cannot work. I had the same issue with a custom Go service here at work. Remove "-u ..." from ${command} and it will work.

I haven't investigated yet how to have only daemon(8) to drop privs. See "man 8 rc.subr" as well. It is documented.

thanks for that tip.
What I do now, is dropping priv (using su) before starting daemon and make sure, daemon can write the pid file and the logs.

I have a final problem, that gitlab has problems executing the restart command, it seems to hang, but restart happens, so I will look later into that. If I execute the service monitorsolar restart as root or as user gitlab uses for that step, it works.

Here the script, maybe it helps also someone else:
#!/bin/sh
# PROVIDE: monitorsolar
# REQUIRE: DAEMON NETWORKING
# KEYWORD: shutdown

#
# Add these lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service
#
# monitorsolar_enable (bool):      Set to NO by default
#                                  Set it to YES to enable monitorSolar.
# monitorsolar_args (string):      Custom extra arguments for monitorSolar
# monitorsolar_user (string):      Set to gitlab_deploy_solar by default
#                                  The user to run the server (make sure user exists)
# monitorsolar_group (string):     Set to gitlab_deploy_solar by default
#                                  The group to run the server (make sure group exists)

. /etc/rc.subr

name="monitorsolar"
desc="Run Monitor Solar server"
rcvar="${name}_enable"

load_rc_config "${name}"

: ${monitorsolar_enable:="NO"}
: ${monitorsolar_user:="gitlab_deploy_solar"}
: ${monitorsolar_group:="gitlab_deploy_solar"}
: ${monitorsolar_args:=""}

logfile="/var/log/${name}/${name}.log"
pidfile="/var/run/${name}/${name}.pid"
configfile="/usr/local/etc/monitorsolar"
workingdir="/usr/home/http/solar.fechner.net/app"

command="/usr/sbin/daemon"
command_args="-H -o ${logfile} -t ${name} -P ${pidfile} \
  sh -c 'cd ${workingdir} && ./monitorSolarApi -config ${configfile} ${monitorsolar_args}'"

start_precmd="${name}_precmd"
start_cmd="${name}_start"

monitorsolar_precmd()
{
  # Ensure pid directory exists
  install -d -g "${monitorsolar_group}" -o "${monitorsolar_user}" "$(dirname "${pidfile}")"

  # Ensure log directory exists
  install -d -g "${monitorsolar_group}" -o "${monitorsolar_user}" "$(dirname "${logfile}")"
}

monitorsolar_start()
{
  su -m ${monitorsolar_user} -c "${command} ${command_args}"
}

run_rc_command "$1"



Reply via email to