From 4f5fe906ba54cf36e249e1e45b04e3649514f25d Mon Sep 17 00:00:00 2001 From: Erich Birngruber Date: Wed, 6 Aug 2025 15:41:33 +0200 Subject: [PATCH 1/5] make Slurm status command configurable --- snakemake_executor_plugin_slurm/__init__.py | 24 +++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/snakemake_executor_plugin_slurm/__init__.py b/snakemake_executor_plugin_slurm/__init__.py index 64502deb..4824efe5 100644 --- a/snakemake_executor_plugin_slurm/__init__.py +++ b/snakemake_executor_plugin_slurm/__init__.py @@ -148,6 +148,20 @@ class ExecutorSettings(ExecutorSettingsBase): "required": False, }, ) + status_commmand: Optional[str] = field( + default="sacct -X --parsable2 \ + --clusters all \ + --noheader --format=JobIdRaw,State \ + --starttime {sacct_starttime} \ + --endtime now --name {run_uuid}", + metadata={ + "help": "The command to query the status of SLURM jobs. " + "This command should return one line for each job with " + "|.", + "env_var": False, + "required": False, + }, + ) # Required: @@ -458,12 +472,10 @@ async def check_active_jobs( # the more readable version ought to be re-adapted # -X: only show main job, no substeps - sacct_command = f"""sacct -X --parsable2 \ - --clusters all \ - --noheader --format=JobIdRaw,State \ - --starttime {sacct_starttime} \ - --endtime now --name {self.run_uuid}""" - + sacct_command = self.workflow.executor_settings.status_commmand.format( + sacct_starttime=sacct_starttime, run_uuid=self.run_uuid + ) + # for better redability in verbose output sacct_command = " ".join(shlex.split(sacct_command)) From a59815db4cdad2bcec8d3017be033fc16172fb21 Mon Sep 17 00:00:00 2001 From: Erich Birngruber Date: Wed, 6 Aug 2025 16:27:10 +0200 Subject: [PATCH 2/5] configurable scancel command, improved doc string for status and cancel commands --- snakemake_executor_plugin_slurm/__init__.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/snakemake_executor_plugin_slurm/__init__.py b/snakemake_executor_plugin_slurm/__init__.py index 4824efe5..1233e948 100644 --- a/snakemake_executor_plugin_slurm/__init__.py +++ b/snakemake_executor_plugin_slurm/__init__.py @@ -157,7 +157,19 @@ class ExecutorSettings(ExecutorSettingsBase): metadata={ "help": "The command to query the status of SLURM jobs. " "This command should return one line for each job with " - "|.", + "|." + "If no accounting is enabled, an alternative is:" + "squeue --states=all --format=%i\|%T --noheader --name {run_uuid}", + "env_var": False, + "required": False, + }, + ) + cancel_commmand: Optional[str] = field( + default="scancel {jobids}", + metadata={ + "help": "The command to cancel SLURM jobs. " + "This command should include the job IDs to cancel." + "In a federation the addiational argument --clusters=all might be used.", "env_var": False, "required": False, }, @@ -602,7 +614,7 @@ def cancel_jobs(self, active_jobs: List[SubmittedJobInfo]): # about 30 sec, but can be longer in extreme cases. # Under 'normal' circumstances, 'scancel' is executed in # virtually no time. - scancel_command = f"scancel {jobids} --clusters=all" + scancel_command = self.workflow.executor_settings.cancel_commmand.format(jobids=jobids) subprocess.check_output( scancel_command, From e76e24da0c815bf24b271e691f0a5e520ba06217 Mon Sep 17 00:00:00 2001 From: Erich Birngruber Date: Wed, 6 Aug 2025 17:11:04 +0200 Subject: [PATCH 3/5] restore default scancel behaviour --- snakemake_executor_plugin_slurm/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snakemake_executor_plugin_slurm/__init__.py b/snakemake_executor_plugin_slurm/__init__.py index 1233e948..9a19176f 100644 --- a/snakemake_executor_plugin_slurm/__init__.py +++ b/snakemake_executor_plugin_slurm/__init__.py @@ -165,7 +165,7 @@ class ExecutorSettings(ExecutorSettingsBase): }, ) cancel_commmand: Optional[str] = field( - default="scancel {jobids}", + default="scancel {jobids} --clusters=all", metadata={ "help": "The command to cancel SLURM jobs. " "This command should include the job IDs to cancel." From a5ad5d277dc0859f261e284e5f1effbf140e37fc Mon Sep 17 00:00:00 2001 From: Erich Birngruber Date: Thu, 7 Aug 2025 11:15:57 +0200 Subject: [PATCH 4/5] fixup mmm in commands --- snakemake_executor_plugin_slurm/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/snakemake_executor_plugin_slurm/__init__.py b/snakemake_executor_plugin_slurm/__init__.py index 9a19176f..1156c056 100644 --- a/snakemake_executor_plugin_slurm/__init__.py +++ b/snakemake_executor_plugin_slurm/__init__.py @@ -148,7 +148,7 @@ class ExecutorSettings(ExecutorSettingsBase): "required": False, }, ) - status_commmand: Optional[str] = field( + status_command: Optional[str] = field( default="sacct -X --parsable2 \ --clusters all \ --noheader --format=JobIdRaw,State \ @@ -164,7 +164,7 @@ class ExecutorSettings(ExecutorSettingsBase): "required": False, }, ) - cancel_commmand: Optional[str] = field( + cancel_command: Optional[str] = field( default="scancel {jobids} --clusters=all", metadata={ "help": "The command to cancel SLURM jobs. " @@ -484,7 +484,7 @@ async def check_active_jobs( # the more readable version ought to be re-adapted # -X: only show main job, no substeps - sacct_command = self.workflow.executor_settings.status_commmand.format( + sacct_command = self.workflow.executor_settings.status_command.format( sacct_starttime=sacct_starttime, run_uuid=self.run_uuid ) @@ -614,7 +614,7 @@ def cancel_jobs(self, active_jobs: List[SubmittedJobInfo]): # about 30 sec, but can be longer in extreme cases. # Under 'normal' circumstances, 'scancel' is executed in # virtually no time. - scancel_command = self.workflow.executor_settings.cancel_commmand.format(jobids=jobids) + scancel_command = self.workflow.executor_settings.canceland.format(jobids=jobids) subprocess.check_output( scancel_command, From 604e7584788cc9bfa3e6b19388ec04ab322233a8 Mon Sep 17 00:00:00 2001 From: Erich Birngruber Date: Thu, 7 Aug 2025 11:24:23 +0200 Subject: [PATCH 5/5] fix more strings --- snakemake_executor_plugin_slurm/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/snakemake_executor_plugin_slurm/__init__.py b/snakemake_executor_plugin_slurm/__init__.py index 1156c056..751e113c 100644 --- a/snakemake_executor_plugin_slurm/__init__.py +++ b/snakemake_executor_plugin_slurm/__init__.py @@ -158,8 +158,8 @@ class ExecutorSettings(ExecutorSettingsBase): "help": "The command to query the status of SLURM jobs. " "This command should return one line for each job with " "|." - "If no accounting is enabled, an alternative is:" - "squeue --states=all --format=%i\|%T --noheader --name {run_uuid}", + "If no accounting is enabled, an alternative is:", + # "squeue --states=all --format=%i|%T --noheader --name {run_uuid}", "env_var": False, "required": False, }, @@ -614,7 +614,7 @@ def cancel_jobs(self, active_jobs: List[SubmittedJobInfo]): # about 30 sec, but can be longer in extreme cases. # Under 'normal' circumstances, 'scancel' is executed in # virtually no time. - scancel_command = self.workflow.executor_settings.canceland.format(jobids=jobids) + scancel_command = self.workflow.executor_settings.cancel_command.format(jobids=jobids) subprocess.check_output( scancel_command,