git: dbb76b3a6836 - main - sysutils/slurm-wlm: Improve rc.d scripts
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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"