Разобрать время работы SLURM для создания переменных - PullRequest
0 голосов
/ 23 октября 2019

С SLURM я запускаю команду

squeue -u enter_username

и получаю вывод таблицы со следующим заголовком

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

Я пытаюсь определить продолжительность времени выполнения заданиябежал за. Я не смог найти переменную окружения, предоставленную SLURM, чтобы записать это время, поэтому я думаю, что мне осталось проанализировать вывод squeue. Это не так просто, как я думал, потому что настенные часы не имеют фиксированного формата. Другими словами, он не всегда показывает дд-чч: мм: сс. Если дней нет, то вывод будет просто ЧЧ: ММ: СС, а если часов нет, то вывод: ММ: СС и т. Д.

Я делаю это с помощью bash, и мне нужно захватитьдень (дд) и час (чч) и присвойте каждому из них переменную. Мне трудно делать это, когда формат динамический.

Чтобы зафиксировать ввод времени, я просто делаю следующее (в сценарии bash SLURM)

 time_str=$(squeue -u enter_username | grep "$SLURM_JOB_ID" | cut -d "R" -f2- | gawk '{print $1}')

Как я уже говорил, time_str не имеет фиксированного формата. Надеюсь, кто-то с опытом может помочь.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Из прочтения справочной страницы команды squeue кажется, что вы можете упростить проблему, если squeue выводит только необходимую информацию:

squeue -h -j ${jobid} -O timeused 

Тогда ваша задача простоПроанализируйте этот вывод, что можно сделать следующим образом:

#!/bin/bash

line="-$(squeue -h -j ${jobid} -O timeused)" # Leading '-' aids parsing.

parts=( 0 0 0 0 )
index=3
while [ ${#line} -gt 0 ]; do
  parts[${index}]=${line##*[-:]}
  line=${line%[-:]*}
  ((index--))
done

Теперь массив ${parts[*]} содержит ровно 4 элемента, от 0 до 3, представляющих дни, часы, минуты и секунды соответственно.

0 голосов
/ 29 октября 2019

Решение, представленное @Andrew Vickers выше, работает как ожидалось. Однако я сделал еще один шаг вперед, чтобы обеспечить фиксированный двухзначный формат

index=0
while [ ${index} -lt 4 ]; do
    if [ ${#parts[${index}]} -lt 2 ]; then
        parts[${index}]="0${parts[${index}]}"
    fi
((index++))
done

. В его ответ можно было бы включить условную проверку, но его цикл должен был бы быть отрегулирован для форматирования всех переменных.

...