<div dir="ltr">Hello all,<br><br>I am submitting a job to a SLURM scheduler, which contains an array of small jobs. <div><br></div><div>For example, here's a script that simply prints out the date and hostname of the compute node from within a heredoc:<br><br>-------------------<br>#!/bin/bash<br>...(variables)...<br>sbatch --parsable --partition=${jobPartition} --array=1-${jobArrayCount} --job-name=${jobName}.%a --output=${jobName}.stdout.%a.%j --error=${jobName}.stderr.%a.%j --mem-per-cpu=${jobMem} --export=ALL <<"EOF"<br>#!/bin/bash<br>stamp=`date && hostname`<br>echo -e "Child array job [${SLURM_ARRAY_TASK_ID}]:\n${stamp}"<br>EOF<br>exit 0<br>-------------------<br><br>The filenames of the output and error logs from this job contain the correct array task ID (1 through ${jobArrayCount}, represented with the %a variable) and parent job ID (represented with the %j variable).<br><br>However, the job name (${jobName}.%a) only expands the ${jobName} variable, and it prints the %a value as a string literal — that is, it is left untranslated to the array task ID.<br><br>For example, if "jobName=foo", then the use of --job-name=${jobName}.%a results in the scheduler using the job name "foo.%a", instead of "foo.1", "foo.2", and so on, up to the number of child jobs in the array.<br><br>As output and error logs can use the %a array task ID variable, is there a way to get the job name assignment to use this variable as well?<br><br>Another thing I tried was to move the job name assignment within the heredoc block:<br><br>-------------------<br>#!/bin/bash<br>...(variables)...<br>sbatch --parsable --partition=${jobPartition} --array=1-${jobArrayCount} --output=${jobName}.stdout.%a.%j --error=${jobName}.stderr.%a.%j --mem-per-cpu=${jobMem} --export=ALL <<"EOF"<br>#!/bin/bash<br>#SBATCH --job-name="${jobName}.${SLURM_ARRAY_TASK_ID}"<br>stamp=`date && hostname`<br>echo -e "Child array job [${SLURM_ARRAY_TASK_ID}]:\n${stamp}"<br>EOF<br>exit 0<br>-------------------<br><br>In this case, the job name is rendered literally as the string "${jobName}.${SLURM_ARRAY_TASK_ID}".<div><br>A third thing that I tried was to rename the job name via `scontrol`, after the fact, which works but only if the job is in the scheduler and only if it is running:<br><br>-------------------<br>$ scontrol update JobId=${arrayJobId} JobName=${jobName}.${jobArrayTaskId}<br>-------------------<br><br>The `sacct` program does not seem to have keywords that grant access to array job and task IDs, e.g.:<br><br>-------------------<br>$ sacct -j ${arrayJobId} --format=ArrayJobId,ArrayTaskId --noheader --parsable2<br>sacct: error: Invalid field requested: "ArrayJobId"<br>-------------------<br><br>(Keywords are listed here: <a href="https://slurm.schedmd.com/sacct.html">https://slurm.schedmd.com/sacct.html</a>)<br><br>However, it looks like I can use `scontrol` to get the array job and task IDs, though it is a bit of a hack:<br><br>-------------------<br>$ scontrol show job ${arrayJobId} | grep ArrayTaskId | awk '{i=split($0,a," "); j=split(a[3],b,"="); k=split(a[4],c,"="); print c[2]"."b[2]; }'<br>testArrayChild.1<br>-------------------<br><br>There are a few problems with this approach:<br><br>1. I can't rename the array of jobs until they are in the scheduler<br>2. My method for getting the array task ID is a hack that seems fragile<br>3. I can't rename the job after it is finished</div><div><br></div><div>These issues seem to make this approach difficult to implement in a reliable way.<br><br>My question, ultimately, is: Is there an easier way to have the an array job name include the array task ID?<br><br>Regards,<br>Alex<br></div></div></div>