Вот быстрый вопрос, который часто возникает и ставит под сомнение мои навыки работы с AWK. Как составить список всех заданий в кластере вместе со списком узлов, в которых они размещены.
Что-то вроде:
JobId Job Name State Hosts
. . .
29428 _2.0_cont_7.job R fm3/6
29429 _2.2_cont_7.job R fm3/6
29430 _2.4_cont_8.job R fm1/6
29431 _2.6_cont_8.job R fm1/6
29835 taverna R mathserv/40
. . .
Есть ли параметр для sinfo
или qstat
, который бы обеспечивал аналогичный вывод без дальнейшей обработки? Или какой хороший perl
или awk
однострочный для этой работы?
Вот что я сейчас запускаю
qstat -f | awk \
'/Job Id/ {job=$3 ;
if (s > 0) {printf("%6s\t%16s\t%5s\t%8s\n",job,name,state,host); } s+=1}
/exec_host/ {host=$3}
/Job_Name/ {name=$3}
/job_state/ {state = $3}
END {printf("%6s\t%16s\t%5s\t%8s\n",job,name,state,host)}
BEGIN {printf("%6s\t%16s\t%5s\t%8s\n","JobId","Job Name","State","Hosts")}'
UPDATE
Вот фрагмент вывода qstat -f
:
Job Id: 29835
Job_Name = taverna
Job_Owner = meos@taverna
interactive = True
job_state = R
queue = all
qtime = Wed Apr 10 12:02:10 2019
mtime = Wed Apr 10 12:02:10 2019
ctime = Wed Apr 10 18:02:10 2019
exec_host = mathserv/40
Priority = 4294873206
euser = meos(1006)
egroup = meos(1000)
Resource_List.walltime = 06:00:00
Resource_List.nodect = 1
Resource_List.ncpus = 40
Такие блоки печатаются для каждого задания, выполняемого в кластере.
Здесь параметр exec_host
определяет узел и количество слотов на этом узле или наименьшее количество узлов с соответствующим количеством слотов, выделенных для задания. Остальные параметры самоочевидны.
Ожидаемый результат только для этого блока будет
JobId Job Name State Hosts
29835 taverna R mathserv/40
ОБНОВЛЕНИЕ 2
Для всех, кто интересуется, обновлена оригинальная программа AWK, чтобы исправить некоторые ошибки
и улучшить форматирование. Это хорошо работает и на управляемых кластерах Torque и PBS.
qstat -f | awk '/Job Id/ {job=$3 ;
if (s > 0) {printf(format,lastjob,user,name,state,host)} ;
lastjob=job ; s+=1}
/exec_host/ {host=$3}
/Job_Name/ {name=$3}
/job_state/ {state = $3}
/Job_Owner/ {user=$3; sub("@.*","",user)}
END {printf(format,lastjob,user,name,state,host)}
BEGIN {format="%10s\t%10s\t%25s\t%5s\t%8s\n";
printf(format,"JobId","Owner","Job Name","State","Hosts")}'