git: dbb76b3a6836 - main - sysutils/slurm-wlm: Improve rc.d scripts

From: Vladimir Druzenko <vvd_at_FreeBSD.org>
Date: Wed, 26 Nov 2025 18:31:28 UTC
The branch main has been updated by vvd:

URL: https://cgit.FreeBSD.org/ports/commit/?id=dbb76b3a6836ad106df7fb4a99753ef55fed939b

commit dbb76b3a6836ad106df7fb4a99753ef55fed939b
Author:     Generic Rikka <rikka.goering@outlook.de>
AuthorDate: 2025-11-26 18:27:56 +0000
Commit:     Vladimir Druzenko <vvd@FreeBSD.org>
CommitDate: 2025-11-26 18:29:59 +0000

    sysutils/slurm-wlm: Improve rc.d scripts
    
    - Add rc.conf knobs for slurm_conf, logdir, rundir, pidfile and logfile paths
    - Run slurmctld and slurmd under daemon(8) in foreground mode (-D)
    - Implement status/reload using pidfiles and procname via rc.subr helpers
    - Create log/run directories with appropriate ownership and permissions
    - Ensure clean shutdown and avoid stray helper processes across restarts
    - Preserve compatibility with existing *_flags and SLURM_CONF settings
    
    PR:     290211
---
 sysutils/slurm-wlm/Makefile           |   1 +
 sysutils/slurm-wlm/files/slurmctld.in | 133 +++++++++++++++++++++++++++++-----
 sysutils/slurm-wlm/files/slurmd.in    | 111 +++++++++++++++++++++++-----
 3 files changed, 209 insertions(+), 36 deletions(-)

diff --git a/sysutils/slurm-wlm/Makefile b/sysutils/slurm-wlm/Makefile
index 9dcd334a93d1..dab07c1d9a1c 100644
--- a/sysutils/slurm-wlm/Makefile
+++ b/sysutils/slurm-wlm/Makefile
@@ -1,5 +1,6 @@
 PORTNAME=	slurm
 DISTVERSION=	25.11.0
+PORTREVISION=	1
 CATEGORIES=	sysutils
 MASTER_SITES=	https://download.schedmd.com/slurm/
 PKGNAMESUFFIX=	-wlm
diff --git a/sysutils/slurm-wlm/files/slurmctld.in b/sysutils/slurm-wlm/files/slurmctld.in
index 5199e48b23bc..94f5429687d4 100644
--- a/sysutils/slurm-wlm/files/slurmctld.in
+++ b/sysutils/slurm-wlm/files/slurmctld.in
@@ -8,36 +8,133 @@
 # Add the following lines to /etc/rc.conf.local or /etc/rc.conf
 # to enable this service:
 #
-# slurmctld_enable (bool):   Set to NO by default.
-#               Set it to YES to enable slurmctld.
+# slurmctld_enable (bool):     Set to NO by default.
+#                              Set it to YES to enable slurmctld.
+#
+# Common knobs (honoured by slurmctld and slurmd):
+#   slurm_user (str):          User to run Slurm daemons as (default: slurm)
+#   slurm_group (str):         Group to run Slurm daemons as (default: slurm)
+#   slurm_conf (str):          Path to slurm.conf, exported as SLURM_CONF
+#                              (default: %%ETCDIR%%/slurm.conf)
+#   slurm_logdir (str):        Log directory (default: /var/log/slurm)
+#   slurm_rundir (str):        Runtime directory (default: /var/run/slurm)
+#
+# Service-specific knobs:
+#   slurmctld_flags (str):     Extra arguments passed to slurmctld.
+#   slurmctld_pidfile (str):   PID file path
+#                              (default: ${slurm_rundir}/slurmctld.pid)
+#   slurmctld_logfile (str):   Log file path
+#                              (default: ${slurm_logdir}/slurmctld.log)
 #
 
 . /etc/rc.subr
 
 name="slurmctld"
-rcvar=slurmctld_enable
-
-pidfile=/var/run/$name.pid
+rcvar="slurmctld_enable"
 
 load_rc_config $name
 
-: ${slurmctld_enable="NO"}
+# Common defaults (shared conceptual contract with slurmd)
+: ${slurm_user:="slurm"}
+: ${slurm_group:="slurm"}
+: ${slurm_conf:="%%ETCDIR%%/slurm.conf"}
+: ${slurm_logdir:="/var/log/slurm"}
+: ${slurm_rundir:="/var/run/slurm"}
+
+# Service defaults
+: ${slurmctld_enable:="NO"}
+: ${slurmctld_flags:=""}
+: ${slurmctld_pidfile:="${slurm_rundir}/slurmctld.pid"}
+: ${slurmctld_logfile:="${slurm_logdir}/slurmctld.log"}
+
+pidfile="${slurmctld_pidfile}"
 
-start_cmd=slurmctld_start
-stop_cmd=slurmctld_stop
+# We run slurmctld under daemon(8) for pidfile/log management.
+command="/usr/sbin/daemon"
+procname="%%PREFIX%%/sbin/${name}"
+command_args="-P ${pidfile} -o ${slurmctld_logfile} ${procname} -D ${slurmctld_flags}"
+
+extra_commands="reload"
+start_precmd="${name}_prestart"
+reload_cmd="${name}_reload"
+status_cmd="${name}_status"
+stop_cmd="${name}_stop"
+
+slurmctld_prestart()
+{
+	# Ensure log and run directories exist with correct ownership/modes.
+	/usr/bin/install -d -o "${slurm_user}" -g "${slurm_group}" -m 0750 "${slurm_logdir}" || return 1
+	/usr/bin/install -d -o "root" -g "wheel" -m 0755 "${slurm_rundir}" || return 1
+
+	# Export SLURM_CONF if not already provided in the environment.
+	if [ -z "${SLURM_CONF}" ]; then
+		export SLURM_CONF="${slurm_conf}"
+	fi
+}
 
-slurmctld_start() {
-    checkyesno slurmctld_enable && echo "Starting $name." && \
-	%%PREFIX%%/sbin/$name $slurmctld_flags
+slurmctld_reload()
+{
+	if [ ! -r "${pidfile}" ]; then
+		echo "${name} not running? (pidfile not found)"
+		return 1
+	fi
+	echo "Reloading ${name} configuration."
+	kill -HUP "$(cat "${pidfile}")"
 }
 
-slurmctld_stop() {
-    if [ -e $pidfile ]; then
-        checkyesno slurmctld_enable && echo "Stopping $name." && \
-	    kill `cat $pidfile`
-    else
-	killall $name
-    fi
+slurmctld_status()
+{
+	if [ ! -r "${pidfile}" ]; then
+		echo "${name} is not running (no pidfile)."
+		return 1
+	fi
+	if ! check_pidfile "${pidfile}" "${procname}"; then
+		echo "${name} is not running (stale pidfile)."
+		return 1
+	fi
+	echo "${name} is running as pid $(cat "${pidfile}")."
+}
+
+slurmctld_stop()
+{
+	if [ ! -r "${pidfile}" ]; then
+		echo "${name} not running? (no pidfile)."
+		return 1
+	fi
+
+	if ! check_pidfile "${pidfile}" "${procname}"; then
+		echo "${name} not running? (stale pidfile: ${pidfile})."
+		rm -f "${pidfile}"
+		return 1
+	fi
+
+	pid="$(cat "${pidfile}" 2>/dev/null || true)"
+	if [ -z "${pid}" ]; then
+		echo "${name} not running? (empty pidfile: ${pidfile})."
+		rm -f "${pidfile}"
+		return 1
+	fi
+
+	echo "Stopping ${name} (pid ${pid})."
+	kill -TERM "${pid}" 2>/dev/null || true
+
+	# Allow a short grace period for clean shutdown and helper cleanup.
+	i=0
+	while [ $i -lt 5 ]; do
+		if ! check_pidfile "${pidfile}" "${procname}"; then
+			rm -f "${pidfile}"
+			return 0
+		fi
+		i=$((i + 1))
+		sleep 1
+	done
+
+	echo "${name} did not exit on SIGTERM; sending SIGKILL to controller and its helpers."
+	# Kill children (e.g. slurmscriptd) first, then the controller itself.
+	pkill -KILL -P "${pid}" 2>/dev/null || true
+	kill -KILL "${pid}" 2>/dev/null || true
+
+	rm -f "${pidfile}"
 }
 
 run_rc_command "$1"
diff --git a/sysutils/slurm-wlm/files/slurmd.in b/sysutils/slurm-wlm/files/slurmd.in
index 277d48a2d317..462cbc6611a0 100644
--- a/sysutils/slurm-wlm/files/slurmd.in
+++ b/sysutils/slurm-wlm/files/slurmd.in
@@ -8,36 +8,111 @@
 # Add the following lines to /etc/rc.conf.local or /etc/rc.conf
 # to enable this service:
 #
-# slurmd_enable (bool):   Set to NO by default.
-#               Set it to YES to enable slurmd.
+# slurmd_enable (bool):       Set to NO by default.
+#                             Set it to YES to enable slurmd.
+#
+# Common knobs (honoured by slurmd and slurmctld):
+#   slurm_user (str):         User to run Slurm daemons as (default: slurm)
+#   slurm_group (str):        Group to run Slurm daemons as (default: slurm)
+#   slurm_conf (str):         Path to slurm.conf, exported as SLURM_CONF
+#                             (default: %%ETCDIR%%/slurm.conf)
+#   slurm_logdir (str):       Log directory (default: /var/log/slurm)
+#   slurm_rundir (str):       Runtime directory (default: /var/run/slurm)
+#
+# Service-specific knobs:
+#   slurmd_flags (str):       Extra arguments passed to slurmd.
+#   slurmd_pidfile (str):     PID file path
+#                             (default: ${slurm_rundir}/slurmd.pid)
+#   slurmd_logfile (str):     Log file path
+#                             (default: ${slurm_logdir}/slurmd.log)
 #
 
 . /etc/rc.subr
 
 name="slurmd"
-rcvar=slurmd_enable
-
-pidfile=/var/run/$name.pid
+rcvar="slurmd_enable"
 
 load_rc_config $name
 
-: ${slurmd_enable="NO"}
+# Common defaults (shared conceptual contract with slurmctld)
+: ${slurm_user:="slurm"}
+: ${slurm_group:="slurm"}
+: ${slurm_conf:="%%ETCDIR%%/slurm.conf"}
+: ${slurm_logdir:="/var/log/slurm"}
+: ${slurm_rundir:="/var/run/slurm"}
+
+# Service defaults
+: ${slurmd_enable:="NO"}
+: ${slurmd_flags:=""}
+: ${slurmd_pidfile:="${slurm_rundir}/slurmd.pid"}
+: ${slurmd_logfile:="${slurm_logdir}/slurmd.log"}
+
+pidfile="${slurmd_pidfile}"
+
+command="/usr/sbin/daemon"
+procname="%%PREFIX%%/sbin/${name}"
+command_args="-P ${pidfile} -o ${slurmd_logfile} ${procname} -D ${slurmd_flags}"
+
+extra_commands="reload"
+start_precmd="${name}_prestart"
+reload_cmd="${name}_reload"
+status_cmd="${name}_status"
+stop_cmd="${name}_stop"
 
-start_cmd=slurmd_start
-stop_cmd=slurmd_stop
+slurmd_prestart()
+{
+	# Ensure log and run directories exist with correct ownership/modes.
+	/usr/bin/install -d -o "${slurm_user}" -g "${slurm_group}" -m 0750 "${slurm_logdir}" || return 1
+	/usr/bin/install -d -o "root" -g "wheel" -m 0755 "${slurm_rundir}" || return 1
 
-slurmd_start() {
-    checkyesno slurmd_enable && echo "Starting $name." && \
-	%%PREFIX%%/sbin/$name $slurmd_flags
+	# Export SLURM_CONF if not already provided in the environment.
+	if [ -z "${SLURM_CONF}" ]; then
+		export SLURM_CONF="${slurm_conf}"
+	fi
 }
 
-slurmd_stop() {
-    if [ -e $pidfile ]; then
-        checkyesno slurmd_enable && echo "Stopping $name." && \
-	    kill `cat $pidfile`
-    else
-        killall $name
-    fi
+slurmd_reload()
+{
+	if [ ! -r "${pidfile}" ]; then
+		echo "${name} not running? (pidfile not found)"
+		return 1
+	fi
+	echo "Reloading ${name} configuration."
+	kill -HUP "$(cat "${pidfile}")"
+}
+
+slurmd_status()
+{
+	if [ ! -r "${pidfile}" ]; then
+		echo "${name} is not running (no pidfile)."
+		return 1
+	fi
+	if ! check_pidfile "${pidfile}" "${procname}"; then
+		echo "${name} is not running (stale pidfile)."
+		return 1
+	fi
+	echo "${name} is running as pid $(cat "${pidfile}")."
+}
+
+slurmd_stop()
+{
+	if [ ! -r "${pidfile}" ]; then
+		echo "${name} not running? (no pidfile)."
+		return 1
+	fi
+
+	if ! check_pidfile "${pidfile}" "${procname}"; then
+		echo "${name} not running? (stale pidfile: ${pidfile})."
+		rm -f "${pidfile}"
+		return 1
+	fi
+
+	echo "Stopping ${name}."
+	kill -TERM "$(cat "${pidfile}")" 2>/dev/null || true
+
+	if check_pidfile "${pidfile}" "${procname}"; then
+		rm -f "${pidfile}"
+	fi
 }
 
 run_rc_command "$1"