수백 명의 다른 사용자가 공유하는 Linux 클러스터에서 시뮬레이션을 실행하고 있습니다. 누가 실행 중인지 결정하는 작업 스케줄러가 클러스터에 설치되어 있으며, 스케줄러 명령 중 하나( showq
)는 모든 활성 작업, 유휴 작업, 차단된 작업 등의 목록을 표시합니다. 해당 출력을 처리하여 언제든지 작업을 실행하는 고유 사용자 수 등을 확인하고 싶습니다. 다음은 showq -r
실행 중인 작업을 보여주는 몇 가지 출력 예입니다 .
active jobs------------------------
JOBID S PAR EFFIC XFACTOR Q USERNAME GROUP MHOST PROCS REMAINING STARTTIME
123456 R bas ----- 1.0 - user_X group_A n1 8 4:00:00 Fri Sep 19 17:25:05
123457 R bas ----- 1.0 - user_Y group_B n2 16 4:00:00 Fri Sep 19 17:25:05
123458 R bas ----- 1.0 - user_Y group_B n3 1 4:00:00 Fri Sep 19 17:25:05
123459 R bas ----- 1.0 - user_X group_A n4 1 4:00:00 Fri Sep 19 17:25:05
123460 R bas ----- 1.0 - user_X group_A n5 2 4:00:00 Fri Sep 19 17:25:05
123461 R bas ----- 1.0 - user_Z group_A n6 4 4:00:00 Fri Sep 19 17:25:05
......
5000 active jobs
구체적으로 다음을 계산하고 싶습니다.
- 작업을 실행하는 고유 사용자 수 및 사용자당 실행 중인 작업 수(그룹에도 동일한 작업을 수행하고 싶지만 일단 사용자에 대해 수행하면 이는 쉽지 않습니다.)
PROCS
사용자/그룹이 점유하는 프로세서 코어 수( )- 사용자/그룹에 대해 실행 중인
PROC=1
직렬( ) 및 병렬( ) 작업 수PROC>1
awk
Python에서는 이 작업을 매우 쉽게 수행할 수 있지만 / sed
또는 다른 Linux 명령을 조합 하여 수행하고 싶습니다 . 매끄러운 농담이 나를 행복하게 만듭니다 :-)
답변1
가장 먼저 해야 할 일은 의 출력에서 원하지 않는 줄 showq -r
, 즉 활성 작업을 나타내는 줄 등을 제거하는 것입니다. 이는 를 사용하여 수행할 수 있거나 데이터 행의 일부를 설명하는 정규 표현식을 showq -r | sed '1,2d' |sed '$d'
사용할 수 있습니다 . 예를 들어 이 경우 값이 항상 이면 작동할 수 있습니다 . 데이터 행만 포함된 파일이 있으면 다음을 사용할 수 있습니다.grep
grep "----"
EFFIC
----
associative arrays in awk
나머지 마법을 완료하세요.
#!/bin/awk
{
proc_count[$7] = proc_count[$7] + $10;
if ($10 > 1) { multi_proc[$7]++; } else { single_proc[$7]++; }
}
END {
for (foo in proc_count) { print foo, proc_count[foo], multi_proc[foo], single_proc[foo] }
}
위의 스크립트를 실행하면 직렬 프로세서 수가 표시되지 않음을 알 수 있습니다 user_z
. 줄 수를 저장하고 0
거기에 a를 인쇄하지 않으려고 하기 때문입니다. 오류 검사를 추가하고 출력을 예쁘게 만드는 것은 여러분의 몫입니다.
답변2
먼저 다음 스크립트를 저장하고 chmod +x
이름을 지정 하십시오 job_processor.awk
.
#!/usr/bin/gawk -f
## $7 username
## $8 groupname
## $10 procs
{
if ( $10 == 1 )
printf ("username: %s and groupname: %s are serial!\n",$7,$8);
else if ( $10 > 1 )
printf ("username: %s and groupname: %s are parallel!\n",$7,$8);
printf ("username: %s and groupname: %s with procs: %d!\n",$7,$8,$10);
}
다음 형식을 사용해야 합니다.
cat jobs |./job_process.awk |sed '1,2d' |sed '$d'
출력은 다음과 같습니다
username: user_X and groupname: group_A are parallel!
username: user_X and groupname: group_A with procs: 8!
username: user_Y and groupname: group_B are parallel!
username: user_Y and groupname: group_B with procs: 16!
username: user_Y and groupname: group_B are serial!
username: user_Y and groupname: group_B with procs: 1!
username: user_X and groupname: group_A are serial!
username: user_X and groupname: group_A with procs: 1!
username: user_X and groupname: group_A are parallel!
username: user_X and groupname: group_A with procs: 2!
username: user_Z and groupname: group_A are parallel!
username: user_Z and groupname: group_A with procs: 4!