@@ -830,3 +830,111 @@ func ParseClusterQueueSummary(out string) ([]ClusterQueueSummary, error) {
830830
831831 return summaries , nil
832832}
833+
834+ /*
835+ qstat -g d
836+ job-ID prior name user state submit/start at queue slots ja-task-ID
837+ -----------------------------------------------------------------------------------------------------------------
838+
839+ 33 0.50500 sleep root r 2025-02-10 16:47:18 all.q@master 1 1
840+ 33 0.50500 sleep root r 2025-02-10 16:47:18 all.q@master 1 3
841+ 33 0.50500 sleep root r 2025-02-10 16:47:18 all.q@master 1 5
842+ 33 0.50500 sleep root r 2025-02-10 16:47:18 all.q@master 1 7
843+ 33 0.50500 sleep root r 2025-02-10 16:47:18 all.q@master 1 25
844+ 33 0.50500 sleep root r 2025-02-10 16:47:18 all.q@master 1 27
845+ 36 0.60500 sleep root qw 2025-02-10 16:52:21 2
846+ 37 0.60500 sleep root qw 2025-02-10 16:52:35 2
847+ 38 0.60500 sleep root qw 2025-02-10 16:52:49 2
848+ 39 0.60500 sleep root qw 2025-02-10 16:53:23 2 1
849+ 39 0.60500 sleep root qw 2025-02-10 16:53:23 2 2
850+ 39 0.60500 sleep root qw 2025-02-10 16:53:23 2 3
851+ 39 0.60500 sleep root qw 2025-02-10 16:53:23 2 8
852+ 39 0.60500 sleep root qw 2025-02-10 16:53:23 2 9
853+ 39 0.60500 sleep root qw 2025-02-10 16:53:23 2 10
854+ 33 0.50500 sleep root qw 2025-02-10 16:47:18 1 29
855+ 33 0.50500 sleep root qw 2025-02-10 16:47:18 1 31
856+ 33 0.50500 sleep root qw 2025-02-10 16:47:18 1 99
857+ 34 0.50500 sleep root qw 2025-02-10 16:51:51 1
858+ */
859+ func ParseJobArrayTask (out string ) ([]JobArrayTask , error ) {
860+ lines := strings .Split (out , "\n " )
861+
862+ jobArrayTasks := make ([]JobArrayTask , 0 , len (lines )- 3 )
863+
864+ for _ , line := range lines [2 :] {
865+ fields := strings .Fields (line )
866+ if len (fields ) < 8 {
867+ continue
868+ }
869+ jobID , err := strconv .Atoi (fields [0 ])
870+ if err != nil {
871+ return nil , fmt .Errorf ("failed to parse jobID: %v" , err )
872+ }
873+ priority , err := strconv .ParseFloat (fields [1 ], 64 )
874+ if err != nil {
875+ return nil , fmt .Errorf ("failed to parse priority: %v" , err )
876+ }
877+ name := fields [2 ]
878+ user := fields [3 ]
879+ state := fields [4 ]
880+ timeString := fields [5 ] + " " + fields [6 ]
881+ jobTime , err := time .Parse ("2006-01-02 15:04:05" , timeString )
882+ if err != nil {
883+ return nil , fmt .Errorf ("failed to parse submit time: %v" , err )
884+ }
885+ var submitTime time.Time
886+ var startTime time.Time
887+ if strings .Contains (state , "qw" ) {
888+ startTime = jobTime
889+ } else {
890+ submitTime = jobTime
891+ }
892+
893+ // if fields[7] is not a number, it is the queue name
894+ var slots int
895+ var taskID int
896+ var queue string
897+
898+ // when waiting there is no queue name
899+ if slotsInt , err := strconv .Atoi (fields [7 ]); err != nil {
900+ queue = fields [7 ]
901+ if len (fields ) > 8 {
902+ slots , _ = strconv .Atoi (fields [8 ])
903+ }
904+ if len (fields ) > 9 {
905+ taskID , _ = strconv .Atoi (fields [9 ])
906+ }
907+ } else {
908+ slots = slotsInt
909+ // waiting jobs
910+ if len (fields ) > 8 {
911+ slots , _ = strconv .Atoi (fields [8 ])
912+ }
913+ if len (fields ) > 9 {
914+ taskID , err = strconv .Atoi (fields [9 ])
915+ if err != nil {
916+ // a single job and parallel job has no taskID
917+ taskID = 0
918+ }
919+ }
920+ }
921+
922+ jobInfo := JobInfo {
923+ JobID : jobID ,
924+ Priority : priority ,
925+ Name : name ,
926+ User : user ,
927+ State : state ,
928+ SubmitTime : submitTime ,
929+ StartTime : startTime ,
930+ Queue : queue ,
931+ Slots : slots ,
932+ JaTaskIDs : []int64 {int64 (taskID )},
933+ }
934+ jobArrayTasks = append (jobArrayTasks , JobArrayTask {
935+ JobInfo : jobInfo ,
936+ })
937+
938+ }
939+ return jobArrayTasks , nil
940+ }
0 commit comments